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");

            }
        }
    }

1 ответ

  1. I think everyhing looks ok, except this one:

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

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

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

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

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