java arraylist<;字符串>;检查满足条件的第一个和最后一个值
我有一个字符串数组列表,名为java arraylist<;字符串>;检查满足条件的第一个和最后一个值,java,arraylist,Java,Arraylist,我有一个字符串数组列表,名为arraylistrecords,它存储将由逗号分隔的数据字符串,。在字符串的[5]位置(被分隔后),将有一个介于0到500之间的值。该数据字符串的示例如下所示: userA, 1418600437, 38.9047, 177.0164, washington, 180 所以无论如何,arraylist将有许多类似数据的字符串。我需要迭代arraylist(它已经按照我想要的顺序排序),然后在arraylist中找到满足条件的第一个值,即位置[5]处的数字是Inte
arraylistrecords
,它存储将由逗号分隔的数据字符串,
。在字符串的[5]位置(被分隔后),将有一个介于0到500之间的值。该数据字符串的示例如下所示:
userA, 1418600437, 38.9047, 177.0164, washington, 180
所以无论如何,arraylist将有许多类似数据的字符串。我需要迭代arraylist(它已经按照我想要的顺序排序),然后在arraylist中找到满足条件的第一个值,即位置[5]处的数字是
<200
,然后找到满足相同条件的arraylist的最后一个值。当检测到第一个值时,将为该记录分配一个字符串,称其为“开始”值,并为最后一个值分配相同的字符串。有人能帮我解释一下逻辑吗,或者只是一个伪代码,说明它是如何工作的?试试下面的代码。使用布尔
标志记录与标准匹配的第一个值。每次条件匹配时,最后一个值都会更新,结果是for
循环完成后,变量lastValue
将存储最后一个匹配值
boolean seenFirst = false;
int firstValue, lastValue;
for (String record : records) {
String[] parts = record.split(", ");
int value = Integer.parseInt(parts[5]);
if (value < 200)) {
lastValue = value;
if (!seenFirst) {
seenFirst = true;
firstValue = value;
}
}
}
boolean seenFirst=false;
int firstValue,lastValue;
for(字符串记录:记录){
String[]parts=record.split(“,”);
int value=Integer.parseInt(部分[5]);
如果(值<200)){
lastValue=值;
如果(!seenFirst){
seenFirst=true;
第一个值=值;
}
}
}
如果您使用的是Java 8,这非常简单:
List<string> records = new ArrayList<>();
String firstValue = records.stream().filter(s -> Integer.parseInt(s.split(",")[5].trim()) < 200)
.findFirst().get();
String lastValue = IntStream.range(0, records.size())
.mapToObj(i -> records.get(records.size() - i - 1))
.filter(i -> Integer.parseInt(s.split(",")[5].trim()) < 200)
.findFirst().get();
List records=new ArrayList();
String firstValue=records.stream().filter(s->Integer.parseInt(s.split(“,”[5].trim())<200)
.findFirst().get();
字符串lastValue=IntStream.range(0,records.size())
.mapToObj(i->records.get(records.size()-i-1))
.filter(i->Integer.parseInt(s.split(“,”[5].trim())<200)
.findFirst().get();
为了得到第一个值,我们得到整数,过滤小于200的值,然后检索第一个值
要获得最后一个值,它是相同的,但迭代是以相反的顺序进行的。正如我在注释中所述:首先进行迭代以获得第一个匹配记录,然后进行反向迭代以获得最后一个匹配记录。在这两种情况下,在找到匹配项后中断迭代 可能看起来像这样:
String first, last;
for (int i = 0; i < records.size(); i++) {
if (Integer.parseInt(records[i].split(", ")[5]) < 200) {
first = records[i];
break;
}
}
for (int i = records.size() - 1; i >=0; i--) {
if (Integer.parseInt(records[i].split(", ")[5]) < 200) {
last = records[i];
break;
}
}
先字符串,后字符串;
对于(int i=0;i=0;i--){
if(Integer.parseInt(记录[i].split(“,”[5])<200){
last=记录[i];
打破
}
}
显然,应该进行重构以消除重复的匹配逻辑。这其中的哪一部分导致了问题?首先进行迭代以获得第一条匹配记录,然后进行反向迭代以获得最后一条匹配记录。在这两种情况下,在找到匹配项后中断迭代。因为arraylist中有2条以上的记录将满足位置5处的数字小于200的条件,所以我只需要第一条记录,在找到它的那一刻,检查将停止,然后再次检查最后一条记录,所以中间的值不会被分配到字符串!就像我说的:找到第一个/最后一个匹配项后,停止迭代。@RobbyCornelissen他需要迭代整个
ArrayList
,因为最终匹配值可能是最后一个条目。@TimBiegeleisen这就是为什么我说:进行反向迭代以找到最后一个值。不需要在整个列表上循环。