Удалить дубликаты в массиве Java [duplicate]

1

Я написал метод для подсчета количества вхождений слов в файл слова. Ранее, по другому методу, я отсортировал слова, чтобы они отображались в алфавитном порядке. Там для ввода образца в этот метод будет выглядеть так: у птиц птиц, идущих в путь, есть

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

public static String[] counter(String[] wordList)
{
    for (int i = 0; i < wordList.length; i++) 
    {
         int count = 1;
         for(int j = 0; j < wordList.length; j++)
         {
             if(i != j)  //to avoid comparing itself
             {
                 if (wordList[i].compareTo(wordList[j]) == 0)   
                 {
                     count++;
                 }
             }
         }

         System.out.println (wordList[i] + " " + count);


     }

    return wordList; 
}

Любая помощь будет высоко ценится.

О, и мой текущий выход выглядит примерно так: 1 от 1 птицы 2 птицы 2 идут 2 идут 2 имеет 1

Теги:
string
arrays
counter

2 ответа

0
Лучший ответ

Я уже опубликовал ответ на этот вопрос. Ваш вопрос почти идентичен - у него возникли проблемы с созданием другого массива и получением NPE.

Это то, что я придумал (при условии, что массив отсортирован):

public static String[] noDups(String[] myArray) { 

    int dups = 0; // represents number of duplicate numbers

    for (int i = 1; i < myArray.length; i++) 
    {
        // if number in array after current number in array is the same
        if (myArray[i].equals(myArray[i - 1]))
            dups++; // add one to number of duplicates
    }

    // create return array (with no duplicates) 
    // and subtract the number of duplicates from the original size (no NPEs)
    String[] returnArray = new String[myArray.length - dups];

    returnArray[0] = myArray[0]; // set the first positions equal to each other
                                 // because it not iterated over in the loop

    int count = 1; // element count for the return array

    for (int i = 1; i < myArray.length; i++)
    {
        // if current number in original array is not the same as the one before
        if (!myArray[i].equals(myArray[i-1])) 
        {
           returnArray[count] = myArray[i]; // add the number to the return array
           count++; // continue to next element in the return array
        }
    }

    return returnArray; // return the ordered, unique array
}

Пример ввода/вывода:

String[] array = {"are", "away", "birds", "birds", "going", "going", "has"};

array = noDups(array);

// print the array out
for (String s : array) {
    System.out.println(s);
}

Выходы:

are
away
birds
going
has
  • 1
    Спасибо, это действительно помогло с проблемой, с которой я столкнулся.
1

Я бы предпочел использовать Map для хранения слова. Ключи на карте хранятся в Set, поэтому их нельзя дублировать. Как насчет чего-то подобного?

public static String[] counter(String[] wordList) {
    Map<String, Integer> map = new HashMap<>();

    for (int i = 0; i < wordList.length; i++) {
        String word = wordList[i];

        if (map.keySet().contains(word)) {
            map.put(word, map.get(word) + 1);
        } else {
            map.put(word, 1);
        }
    }

    for (String word : map.keySet()) {
        System.out.println(word + " " + map.get(word));
    }

    return wordList;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню