Я написал метод для подсчета количества вхождений слов в файл слова. Ранее, по другому методу, я отсортировал слова, чтобы они отображались в алфавитном порядке. Там для ввода образца в этот метод будет выглядеть так: у птиц птиц, идущих в путь, есть
Мой вопрос: как удалить повторяющиеся вхождения в этом методе? (после подсчета 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
Я уже опубликовал ответ на этот вопрос. Ваш вопрос почти идентичен - у него возникли проблемы с созданием другого массива и получением 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
Я бы предпочел использовать 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;
}