我有此列表["z", "1", "3", "x", "y", "00", "x", "y", "4"]
,在这种情况下,我需要获取字符串Integer
之后的第一个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
。我应该在过滤器中添加什么?
答案 0 :(得分:4)
评论中的内容。
String result = myList.stream().skip(myList.indexOf("00") + 1)
.filter((str) -> !"x".equals(str) && !"y".equals(str) && !"z".equals(str))
.findFirst()
.orElse("");
答案 1 :(得分:2)
也许是一个简单的for循环。比流表达式更易读的很多,也更通用,因为'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
答案 2 :(得分:1)
您可以尝试以下代码。
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存在于列表中,否则它将返回列表中的第一个整数。
答案 3 :(得分:0)
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;
}
}
答案 4 :(得分:0)
您可以使用streams
执行以下操作:
String result=myList.subList(myList.indexOf("00")+1, myList.size()).stream().filter(string->string.matches("\\d+")).findFirst().get();
即使您使用的是字符串而不是x
,y
,z
,该解决方案也可以为您带来良好的结果。
答案 5 :(得分:0)
如果您现在没有列表索引。你可以做这样的事情
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+");
};