2016-11-08 5 views
0

noob здесь, извините, если я скажу что-нибудь немое.Java: сопоставление строк ArrayList с итератором и приращение целых чисел другого ArrayList с тем же индексом

Я сравниваю строки в ArrayList с итератором строк в итераторе наборов. Когда я нахожу совпадение, я хочу захватить индекс совпадающей строки в ArrayList и увеличить этот же индекс в другом массиве ArrayList. У меня есть что-то, что выглядит (мне), как будто оно должно работать, но после этого кода мой целочисленный ArrayList содержит в основном -1 с несколькими 2,1 и 0.

Я заинтересован в исправлении кода , но мне также были бы интересны разные подходы, поэтому вот более общая картина: у меня есть карта, где ключи являются именами пользователей в социальной сети, а значения задают имена пользователей, за которыми они следуют. Мне нужно вернуть список всех имен пользователей в порядке убывания последователей. В приведенном ниже коде я только пытаюсь сделать ArrayList строк (который содержит все имена пользователей в карте), что соответствует с другим ArrayList целых чисел, как:

usernamesList ... numberOfFollowers 
theRealJoe ... 7 
javaNovice ... 3 
FakeTinaFey ... 3 

и т.д.

Map<String, Set<String>> map = new HashMap<String, Set<String>>(); 
    //edit: this map is populated. It's a parameter of the method I'm trying to write. 
    List<String> usernamesList = new ArrayList<String>(); 
    //populate usernamesList with all strings in map   

    Iterator<Set<String>> setIter = map.values().iterator(); 
    Iterator<String> strIter; 
    int strIterIndex = 0; 
    int w = 0; 
    List<Integer> numOfFollowers = new ArrayList<Integer>(); 
    //initialize all elements to 0. not sure if necessary 
    for (int i = 0; i < usernamesList.size(); i++) { 
     numOfFollowers.add(0); 
    } 

    while (setIter.hasNext()) { 

     Set<String> currentSetIter = setIter.next(); 
     strIter = currentSetIter.iterator(); 

     while (strIter.hasNext()) { 

      String currentstrIter = strIter.next(); 

      if (usernamesList.contains(currentstrIter)) { 

       strIterIndex = usernamesList.indexOf(currentstrIter); 
       numOfFollowers.set(strIterIndex, numOfFollowers.indexOf(strIterIndex) +1); 
       w++; 
       System.out.println("if statement has run " + w + " times."); 

      } else { 

       throw new RuntimeException("Should always return true. all usernames from guessFollowsGraph should be in usernamesList"); 

      } 
     } 
    } 
+0

Вы карта не имеет значения, так что этот код 'while (setIter.hasNext()) {' не будет введено в –

+1

На карте действительно есть ключи и значения. Извините, если это сбивает с толку. Я включил конструктор карты, чтобы вы знали, как была вызвана моя карта. – ScorchConway

+0

'Карта > map = HashMap >();' map не имеет значений –

ответ

0

Я думаю, что everyhing выглядит нормально, кроме этого:

numOfFollowers.set(strIterIndex, numOfFollowers.indexOf(strIterIndex) +1); 

Когда вы numOfFollowers.indexOf, вы ищете индекс из n, который имеет значение strInterIndex. То, что вы хотите, это значение (количество повторитель) элемента с индексом strIterIndex:

numOfFollowers.set(strIterIndex, numOfFollowers.get(strIterIndex) +1); 

Я также хотел бы предложить использовать INT [] (массив), а список индексов. Это было бы быстрее и проще.

О, еще одна вещи: исправить «поддельные» конструкторы, пожалуйста, они не будут работать, так как нет «нового» ключевого слова после назначения ...