【问题标题】:Find and return all duplicates of given user input in arrayList (Integers and Strings)在arrayList(整数和字符串)中查找并返回给定用户输入的所有重复项
【发布时间】:2019-04-20 17:27:17
【问题描述】:

遇到一些初学者的麻烦。 我有一个包含多个元素的 arrayList,但在尝试返回所有重复项的列表时遇到问题。 我存储在 arrayList 中的信息:

LogEntry(LocalDateTime date, String status, int id, String cod)

2018-10-23T12:05:22 DATA 325 6d33
2017-01-13T10:09:30 INFO 325 5f22
2018-05-10T18:55:30 INFO 111 6a23
2018-05-03T17:44:50 ERROR 325 5f22
2017-06-15T16:25:31 DATA 111 8472

ArrayList<LogEntry> logList = new ArrayList();

我尝试使用它来搜索字符串条目:

    String logLevel;
    System.out.println("Search Log Level:\n(Info, Debug, Error)");
    logLevel = read.nextLine().toUpperCase();

    List<Integer> allIndexes
            = IntStream.range(0, logList.size()).boxed()
                    .filter(i -> logList.get(i).status.equals(logLevel))
                    .collect(Collectors.toList());

    // check duplicates      
    for (int i = 0; i < allIndexes.size(); i++) {
        System.out.println(logList.get(i).checkData());          
    }

但我的结果好坏参半(从另一台 PC 运行时返回错误)。

试图适应搜索整数是行不通的:

private static void id_n() {
    int logid;
    System.out.println("ID:\n");
    logid = read.nextInt();

    List<Integer> allIndexes
            = IntStream.range(0, logList.size()).boxed()
                    .filter(i -> logList.get(i).id.equals(logid))
                    .collect(Collectors.toList());

    for (int i = 0; i < allIndexes.size(); i++) {
        System.out.println(logList.get(i).checkData());
    }

}

所以我已经开始害怕尝试从这个混乱中获取日期范围了。

我在这里做错了什么?如何改进? 感谢您的帮助。

差点忘了,checkData 是我的 LogEntry 类中的一个函数:

public String checkData() {
            return " > " + this.date + " " + this.status + " " + this.id + " " + this.cod;
    }

已解决,谢谢@JB Nizet 和@Deadpool

状态

logList.stream().filter(i -> i.status.equals(logLevel)).forEach(j -> System.out.println(j.checkData()));

id

logList.stream().filter(i -> i.id == logid).forEach(j -> System.out.println(j.checkData()));

为了进一步处理收集的数据,我刚刚将其发送到一个新的 arrayList。
status

ArrayList<LogEntry> logLevels = new ArrayList();
logList.stream().filter(i -> i.status.equals(logLevel)).forEach(j -> logLevels.add(0, j));

【问题讨论】:

  • 欢迎来到 Stack Overflow!请查看我们的SO Question Checklist 以帮助您提出一个好问题,从而得到一个好的答案。
  • 为什么要创建索引列表,而不是 LogEntry 列表?为什么还要制作一个列表而不是直接从流中打印? “不起作用”究竟是什么意思?你的具体问题是什么?
  • 当我在 arrayList 上找到任何重复项时,我试图获取整行,例如在搜索 ID:111 时,我会得到:2018-05-10T18:55:30 INFO 111 6a23 和2017-06-15T16:25:31 DATA 111 8472。这就是我选择索引的原因,但从你的评论来看,这可能不是一个好主意......
  • 你所说的“整行”就是“一个LogEntry”。
  • 感谢您指出正确的方向。

标签: java string arraylist duplicates int


【解决方案1】:

我认为IntStream 不是一个好主意,而不是直接流式传输logList 对象以获取重复项

根据状态过滤并打印重复值

logList.stream().filter(i->i.getStatus().equals(logLevel)).forEach(j->System.out.println(j.checkData());

根据 id 过滤并打印重复值

logList.stream().filter(i->i.getId==logid).forEach(j->System.out.println(j.checkData());

【讨论】:

  • 谢谢,只需对代码做一点小改动:logList.stream().filter(i -&gt; i.status.equals(logLevel)).forEach(j -&gt; System.out.println(j.checkData()));
猜你喜欢
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
相关资源
最近更新 更多