Java 8 Поток: найти первый элемент после элемента - PullRequest
3 голосов
/ 17 марта 2020

У меня есть список ["z", "1", "3", "x", "y", "00", "x", "y", "4"], который мне нужен, чтобы получить первый элемент Integer после String 00, в данном случае 4. Я использую Java 8 потоков, но любой другой метод приветствуется. Вот мой стартовый код

myList.stream()
      // Remove any non-Integer characters
      .filter((str) -> !"x".equals(str) && !"y".equals(str) && !"z".equals(str))
      .findFirst()
      .orElse("");

, который начинает меня с удаления всех нецелых строк, но дает мне 1. Теперь мне нужно получить 4, который является первым элементом после 00. Что мне добавить в фильтр?

Ответы [ 6 ]

4 голосов
/ 17 марта 2020

Получено из комментария.

 String result = myList.stream().skip(myList.indexOf("00") + 1)
        .filter((str) -> !"x".equals(str) && !"y".equals(str) && !"z".equals(str))
        .findFirst()
        .orElse("");
2 голосов
/ 17 марта 2020

Простой для l oop, возможно. lot более читабельный, чем потоковое выражение, также более общее, поскольку строки типа 'x' и 'y' не жестко запрограммированы в нем.

boolean found00 = false;
int intAfter00 = -1;
for(String str: myList) {
    if("00".equals(str)) {
       found00 = true; //from this point we look for an integer
       continue;
    }
    if(found00) { //looking for an integer
       try {
           intAfter00 = Integer.parseInt(str);
       } catch(Exception e) {
          continue; //this was not an integer
       }
       break;
    }
}
//If intAfter00 is still -1 here then we did not found an integer after 00
1 голос
/ 17 марта 2020

Вы можете попробовать код ниже.

import java.util.Arrays;
import java.util.List;
import java.util.Optional;

public class Main {

    public static void main(String[] args) {

        List<String> list = Arrays.asList("z", "1", "3", "x", "y", "00", "x", "y", "4");

        String str = "00";

        Optional<String> dataOptional = list.stream().skip(list.indexOf(str)+1).filter(s -> {
            try {
                Integer.parseInt(s);
                return true;
            } catch (NumberFormatException n) {
                return false;
            }
        }).findFirst();

        if (dataOptional.isPresent()) {
            System.out.println("Data is :: " + dataOptional.get());
        } else {
            System.out.println("No integer present after given string");
        }

    }
}

Убедитесь, что str присутствует в списке, иначе он вернет первое целое число из списка.

0 голосов
/ 17 марта 2020

Если у вас нет индекса списка в данный момент. Вы могли бы сделать что-то вроде этого

int count = 0;

Stream.of("z", "1", "3", "x", "y", "00", "98", "y", "4")
.peek(element -> {
    if (element.equals("00") || count > 0 && isNumber(element))
        count++;
}).filter(element -> isNumber(element) && count == 3).findFirst().orElse(null);

private boolean isNumber(String element) {
    return element.matches("\\d+");
};
0 голосов
/ 17 марта 2020

Вы можете сделать следующее, используя streams:

String result=myList.subList(myList.indexOf("00")+1, myList.size()).stream().filter(string->string.matches("\\d+")).findFirst().get();

Это решение дает вам хороший результат, даже если вы используете строки вместо x, y, z.

0 голосов
/ 17 марта 2020
int index = myList.indexOf("00");
String result =myList.stream.skip(index).filter(str->isInteger(str)).findFirst().orElse(null);

private boolean isInteger(String str){
 try{
   Integer.parseInt(str);
   return true;
 } catch (NumberFormatException e) {
   return false;
 }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...