2011-10-17 4 views
1

J'ai écrit un modèle de données, dans une classe que j'ai besoin de fusionner 3 tableaux. Ces tableaux ont une taille fixe (bien sûr) et initialisée à null. J'utilise ce code:Merge null Arrays Java

public static <T> T[] merge(T[]... arrays) { 
    int size = 0; 
    for (T[] array : arrays) { 
     size += array.length; 
    } 

    T[] merged = (T[]) Array.newInstance(arrays[0][0].getClass(), size); 

    int start = 0; 
    for (T[] array : arrays) { 
     System.arraycopy(array, 0, 
      merged, start, array.length); 
     start += array.length; 
    } 
    return (T[]) merged; 
} 

Cette ligne est incorrecte:

T[] merged = (T[]) Array.newInstance(arrays[0][0].getClass(), size); 

Je dois de préciser quelle classe je l'utilise, mais je reçois un pointeur nul!

Répondre

2

Je miserait la bibliothèque Collections

public static <T> T[] merge(T[]... arrays) {  
    List<T> list = new LinkedList<T>(); 
    for(T[] array : arrays) { 
     for(T t : array) { 
      list.add(t); 
     } 
    } 
    return (T[])(list.toArray());  
} 

Programme de test:

import java.util.*; 
class Merger { 
    // break out total length logic. Will probably be inlined, but this seems like 
    // functionality that deserves its own method. 
    public static <T> int totalLength(T[]... arrays) { 
     int length = 0; 
     for(T[] arr : arrays) length += arr.length; 
     return length; 
    } 

    public static <T> T[] merge(T[]... arrays) { 
     int length = totalLength(arrays); 
     if(length == 0) return (T[])new Object[0]; 
     List<T> list = new ArrayList<T>(length); 
     for(T[] array : arrays) { 
      for(T t : array) { 
       list.add(t); 
      } 
     } 
     return (T[])(list.toArray(arrays[0])); 
    } 

    public static void main(String[] args) { 
     String[] first = new String[] { "This", "is", "a", "test" }; 
     String[] second = new String[] { "of", "the", "merger" }; 
     String[] third = new String[] { "and", "it", "works!" }; 

     String[] merged = merge(first,second,third); 
     for(String s : merged) System.out.println(s); 

     // validate that it works for merging all 0 arrays: 
     merge(); 
    } 
} 
+0

Création d'un 'ArrayList' avec la capacité appropriée serait plus rapide. – SLaks

+0

@SLaks Marginalement plus rapide, peut-être. Je pense que cela tombe sous le "97%" des inefficacités à ignorer jusqu'à ce qu'il se révèle être un problème, personnellement. Mais je suis d'accord qu'il serait plus rapide de le faire de cette façon. – corsiKa

+0

En effet ... Je crois que l'interface 'List' supporte une méthode' toArray() ', mais elle sera naturellement plus rapide avec un' ArrayList'. – bdares

0

les opérations suivantes:

String[] strings = new String[3]; 
Class stringArrayClass = strings.getClass(); 
Class stringArrayComponentType = stringArrayClass.getComponentType(); 
System.out.println(stringArrayComponentType); 

comme décrit à http://tutorials.jenkov.com/java-reflection/arrays.html#componenttype

Notez également que vous devez passer composant plutôt que tableau de type à Arrays.create.

0

Vous pouvez trouver le type de l'élément du tableau car il n'y a aucun élément dans le tableau.
null n'a pas de type.

Au lieu de cela, vous pouvez obtenir le type de tableau lui-même en écrivant arrays[0].getClass().getComponentType()