Вы должны посчитать количество элементов этой длины. В настоящее время ваш код выделяет массив результатов с len
количеством элементов. Длина самой длинной строки (len
в вашем коде) не имеет ничего общего с количеством строк этой длины.
public static String[] allLongestStrings(String[] inputArray) {
int len = 0;
int num = 0;
for (String temp : inputArray) {
if (temp.length() == len) {
num++;
} else if (temp.length() > len) {
len = temp.length();
num = 1;
}
}
String[] ret = new String[num]; // <-- allocate the right number of elements
for (int i = 0, j = 0; i <= inputArray.length - 1; i++) {
if (inputArray[i].length() == len) {
ret[j++] = inputArray[i];
}
}
return ret;
}
Она выполняет итерацию по массиву, проверяя самую длинную строку, сохраняя при этом числоэлементов самой длинной строки, которую мы видели до сих пор. После первой итерации вы будете знать количество элементов, которые будут включены в массив результатов, и, следовательно, вы можете выделить правильный размер и заполнить его.
Еще один интересный способ сделать это с помощью потоков Java:
public static String[] allLongestStrings(String[] inputArray) {
TreeMap<Integer, List<String>> lengthToStrings = Arrays.stream(inputArray)
.collect(Collectors.groupingBy(String::length, TreeMap::new, Collectors.toList()));
return lengthToStrings.lastEntry()
.getValue()
.toArray(new String[0]);
}
Первая часть создает TreeMap, который имеет отображение от длины String до списка строк этой длины. Так как он упорядочен естественным порядком целых чисел (в порядке возрастания), мы можем получить максимальную длину, прочитав последнюю запись. Эта запись будет иметь все строки этой длины.
Последняя часть преобразует List<String>
в String[]
и возвращает его.