2009-07-10 4 views
4

Я использую следующий код попробовать создать массив строк векторов, я надеюсь, что массив 3-х элементов, каждый элемент является вектор строк:Как создать массив векторов строк в Java?

Vector<String> Result_Vector_Array[]=new Vector<String>[3]; 

Но NB выделены линии как ошибки (общий массив создание), что не так? Каков правильный способ сделать это? Я знаю, что есть также Arraylist, но он не синхронизирован, поэтому я хочу использовать вектор.

+0

Что такое вектор строк? – Mnementh

+0

Является ли вектор устаревшим? – Tom

+0

P.S. Вместо этого используйте ArrayList !!! – jjnguy

ответ

6

Благодаря type erasure, виртуальная машина не знает, что во время выполнения у вас есть Vector из String. Лучшее, что он может сделать, это создать «сырой» вектор. Он не может гарантировать, что все Vector s действительно содержат String s. Вот почему вы получаете предупреждение от своей IDE.

Один из способов обойти это, он бросил его, как предлагает jgubby. Другой - поставить List в ваш Vector s, а не массив.

Но, что еще более важно, почему массив может иметь только 3 элемента? Не было бы лучше создать класс с тремя полями для ввода в ваш Vector? С тремя элементами это не так много, и вы получаете дополнительный бонус, который вы можете дать каждому из трех элементов полезному имени, что должно сделать ваш код намного понятнее.

Кроме того, поскольку Java 6, существует ряд полезных новых синхронизированных List реализаций, которые могли бы работать лучше, чем Vector, таких как CopyOnWriteArrayList или обернуть регулярные List в Collections.synchronizedList.

+0

Создайте класс! Да, отличная идея, которая открывает дверь гораздо больше, спасибо! – Frank

5

Вы не можете создать массив вроде этого, сделайте следующее:

Vector<String> Result_Vector_Array[] = (Vector<String>[]) new Vector[3]; 

Я хотел бы предложить другой подход - массивы контейнеров, как, которые часто довольно трудно использовать, и не помогают в понимании ваш код.

PS Также стоит отметить, что конвенция Java Naming будет

Vector<String> resultVectorArray[] = (Vector<String>[]) new Vector[3]; 

и это не принято включать тип в имени (я подозреваю, что это будет спорным!), Почему бы не назвать его просто результат» 'и пусть система типов беспокоится о типе?

+0

Я не понимаю, почему. Где общий тип? Строка - это конкретный класс, и если мы параметризируем вектор, то вектор будет. Или? – Geo

+0

Спасибо, я использую этот подход, потому что я знаю размерность массива, но не знаю, сколько элементов будет в векторе, векторы будут расти по мере их поступления, я не буду знать их размеры до тех пор, пока работа не будет выполнена , Какие-нибудь лучшие решения? – Frank

0

с помощью отражения было бы:

Vector<String>[] arrayOfVectors = 
     (Vector<String>[]) java.lang.reflect.Array.newInstance(Vector.class, size); 
    java.util.Arrays.fill(arrayOfVectors, new Vector<String>()); 
    for (Vector<String> v : arrayOfVectors) { 
     System.out.println(v); 
    } 

в качестве альтернативы вы можете использовать ArrayList и затем обернуть его с помощью Collections#synchronizedList(java.util.List)

+0

Почему ???????????? –

+0

, потому что вы не можете создать массив в виде вектора Result_Vector_Array [] = (Vector []) new Vector [3]; – dfa

1

Вы также можете создать:

Vector<Vector<String>> Result_Vector_Array=new Vector<Vector<String>>(); 

Или вы можете заменить Vector с некоторой другой коллекцией.

1

Я хотел бы предложить, чтобы с коллекциями, что-то вроде

Collection<Vector<String>> resultVectorArray = new ArrayList<Vector<String>>(3); 

Затем вы можете использовать дженерики с Застройщиком и практически говорили тот же эффект

+0

Список будет достаточно. – OscarRyz

0

Если вы хотите использовать синхронизированные ArrayList, вы можете использовать метод synchronizedList в java.util.Collections.

ArrayList<String> a1 = new ArrayList<String>(); 
ArrayList<String> a2= new ArrayList<String>(); 
ArrayList<String> a3 = new ArrayList<String>(); 

ArrayList<String> array[] = (ArrayList<String>[]) new ArrayList[3]; 

array[0]= Collections.synchronizedList(a1); 
array[1]= Collections.synchronizedList(a2); 
array[2]= Collections.synchronizedList(a3); 
-1

Должен ли я понимаю, что вы собираетесь использовать многопоточный на этом массиве? ...

Если нет, то вам не придется беспокоиться о синхронизации.

я бы:

List<List<String>> listOfLists = new ArrayList<List<String>>(); 

    List<String> firstVector = new ArrayList<String>(); 

    firstVector.add("one"); 
    firstVector.add("two"); 

    listOfLists.add( firstVector); 

    System.out.println(listOfLists.get(0).get(0) == "one"); 
    System.out.println(listOfLists.get(0).get(1) == "two"); 

печать истинная, настоящая

Смежные вопросы