Фильтровать большую строку

#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