Итерация двух векторов одного и того же размера разных значений с одним утверждением ForEach в Java - PullRequest
0 голосов
/ 02 февраля 2011

Можно ли использовать один

Vector vector1 = new Vector();
Vector vector2 = new Vector();
Map map = new HashMap();
for(String key:vector1&&String value:vector2)
{
 map.put(key,value);
}

или что-то подобное. Я пытаюсь наложить карту с этими двумя векторами. Я пробовал выше для каждого оператора, но это дало мне синтаксическую ошибку. Любая помощь .?

Ответы [ 8 ]

2 голосов
/ 02 февраля 2011

Его не разрешено. Однако вы можете использовать это.

        Vector<String> vector1 = new Vector();
        Vector<String> vector2 = new Vector();
        Map <String,String> map = new HashMap<>();
        for (int index = 0 ; index < vector1.size() ; index ++ )      //vector1 & vector are of same length
        {
            map.put(vector1.elementAt(index), vector2.elementAt(index));
        }
2 голосов
/ 02 февраля 2011

Это не может работать.

это:

for(String key:vector1){
}

является сокращением для этого:

for(Iterator<String> it = vector1.iterator();it.hasNext();){
    String key = it.next();
}

И он работает только с одним итератором.

Вот код, который приближается к тому, что вы хотите:

// don't use vector, it's ancient and unofficially deprecated
final List<String> keyList = new ArrayList<String>();
final List<String> valueList = new ArrayList<String>();

//...
// add keys and values here


final Map<String, String> map = new HashMap<String, String>();
for(
    Iterator<String> it1 = keyList.iterator(), it2 = valueList.iterator();
    // this works even if the lists have different sizes
    it1.hasNext() && it2.hasNext();){

    map.put(it1.next(), it2.next());

}

Я также позволил себе устранить некоторые недостатки в вашем коде:

  1. Не используйте необработанные типы в новом коде (используйте обобщения)
  2. Не используйте Vector, Hashtable или Enumeration, используйте ArrayList<E>, HashMap<K,V>, Iterator<E> (соответственно). Многие вопросы здесь охватывают это, , включая этот
2 голосов
/ 02 февраля 2011

Почему бы просто не использовать старый стиль?

for (int i = 0; i < vector1.size() && i < vector2.size(); i++) { 
  map.put(vector1.get(i), vector2.get(i));
}
1 голос
/ 02 февраля 2011

для каждого цикла позади сцены преобразуется в типичный итератор старой моды, поэтому

 for(String item : items){
  ...
 }

Преобразуются компилятором в

Iterator iItems = items.iterator()
while(iItems.hasNext()){
    String item = iItems.next();
     ...
}

Чтобы ты мог сделать что-то вроде этого:

Iterator iVector2 = vector2.iterator();
for(String item1: vector1){
  String item2 = iVector2.next();
  ....
}
1 голос
/ 02 февраля 2011

Нет параллельного оператора for, но вы можете использовать Iterator s:

Vector vector1 = new Vector();
// ...populate vector1...
Vector vector2 = new Vector();
// ...populate vector2...
Map map = new HashMap();
Iterator it1, it2;
it1 = vector1.iterator();
it2 = vector2.iterator();
while (it1.hasNext() && it2.hasNext())
{
    map.put(it1.next(), it2.next());
}
1 голос
/ 02 февраля 2011

Нет, это не работает. Вы можете получить этот эффект следующим образом:

Iterator<String> i1 = v1.iterator();
Iterator<String> i2 = v2.iterator();
while (i1.hasNext()) {
  map.put(i1.next(), i2.next();
}
assert !i2.hasNext();
1 голос
/ 02 февраля 2011

Нет такой конструкции, но вы можете сделать что-то вроде:

Iterator i1 = vector1.iterator();
Iterator i2 = vector2.iterator();

while (i1.hasNext() ) {
   map.put(i1.next(),i2.next());
}

Предполагая одинаковый размер для обоих векторов.

1 голос
/ 02 февраля 2011

Нет, ничего подобного. Вам придется использовать две петли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...