#java #java-stream
#java #java-поток
Вопрос:
У меня есть массив строк, и задача состоит в том, чтобы найти самую длинную строку в массиве и местоположение этой строки.Мне интересно, могу ли я преобразовать массив в список, и с помощью stream я могу решить ту же проблему. Любая помощь была бы оценена
Я уже решил проблему традиционным способом, используя циклы и некоторые условия if
String names[]={"John","Malisa","Stack Overflow"};
String b=names[i];
int max=b.length();
for(int i=1;i<names.length;i ) {
if(max<names[i].length) {
max=names[i].length;
b=names[i];
}
}
Комментарии:
1. Вам не нужно преобразовывать ее в список. Используется
Arrays.stream
для потоковой передачи содержимого массива. Кроме того, ваше решение не указывает местоположение максимальной строки, а поток затруднит ее поиск (хотя и не является невозможным).2. и как мне использовать метод filter с stream, есть идеи?
Ответ №1:
Вам не нужен filter
метод, чтобы найти самую длинную строку в массиве. Использовать max
с компаратором:
String max = Arrays.stream(names)
.max(Comparator.comparingInt(String::length))
.orElse("");
Чтобы найти индекс этого элемента, используйте:
int index = Arrays.asList(names).indexOf(max);
Комментарии:
1. как насчет max в indexOf?
Ответ №2:
Просто используйте :-
Arrays.stream(names)
.sorted(Comparator.comparing(String::length,Comparator.reverseOrder()))
.findFirst()
.get()
Ответ №3:
Вы можете использовать Arrays.stream
и сравнивать длину:
String names[]={"John","Malisa","Stack Overflow"};
Optional<String> max = Arrays.stream(names)
.max(Comparator.comparingInt(String::length));
System.out.println(max.orElse("none"));
UPD
Я не правильно понял ваш вопрос.
Вы можете использовать этот код, чтобы получить индекс максимального элемента:
String names[]={"John","Malisa","Stack Overflow"};
int index = IntStream.range(0, names.length)
.reduce((i, j) -> names[i].length() > names[j].length() ? i : j)
.getAsInt();
System.out.println(index);
Ответ №4:
Вот другой подход для одновременного получения самой длинной строки и ее индекса:
String[] names = {"John", "Malisa", "Stack Overflow"};
Optional<Map.Entry<String, Integer>> result = IntStream.range(0, names.length).boxed()
.collect(Collectors.toMap(i -> names[i], Function.identity()))
.entrySet().stream()
.max(Comparator.comparing(e -> e.getKey().length()));
result.ifPresent(e -> System.out.println("Longest String: '" e.getKey() "' at index " e.getValue()));
Это создает сопоставление со строкой и ее индексом. После этого он возвращает запись с самой длинной строкой.
Результатом для вашего names
массива является:
Longest String: 'Stack Overflow' at index 2