Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java arraylist<;字符串>;检查满足条件的第一个和最后一个值_Java_Arraylist - Fatal编程技术网

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这就是为什么我说:进行反向迭代以找到最后一个值。不需要在整个列表上循环。