【问题标题】:List key comparisons and return value列出键比较和返回值
【发布时间】:2017-07-21 06:00:45
【问题描述】:

我想比较两个不同数组列表的键说

List<DataSt> list1 = new ArrayList<DataSt>();
List<DataSt> list2= new ArrayList<DataSt>();

DataSt 是:

public class DataSt {

    public String key;
    BigDecimal time;
    BigDecimal memory;


    public DataSt(String key,BigDecimal time, BigDecimal memory)
    {
        this.key=key;
        this.time=time;
        this.memory=memory;
    }
}

列表1:

<org.openjdk.jmh.samples.JMHSortBenchmark.collectionsSort,6691.679,5454>
<org.openjdk.jmh.samples.JMHSortBenchmark.abcdSort,5151.45,54545>
<org.openjdk.jmh.samples.JMHSortBenchmark.saasSort,5454.54,21212.2>
<org.openjdk.jmh.samples.JMHSortBenchmark.xyzSort,888.22,2115>

列表2:

<org.openjdk.jmh.samples.JMHSortBenchmark.xyzSort,7448.362,7887.2>
<org.openjdk.jmh.samples.JMHSortBenchmark.abcdSort,951.5,4512.5>
<org.openjdk.jmh.samples.JMHSortBenchmark.lmnSort,4454.54,455.2>

如果它们匹配,例如“org.openjdk.jmh.samples.JMHSortBenchmark.xyzSort”,所以我想返回 list1 和 list2 的 &lt;Key,time,memory&gt;,即它必须返回

org.openjdk.jmh.samples.JMHSortBenchmark.xyzSort,888.22,2115
org.openjdk.jmh.samples.JMHSortBenchmark.xyzSort,7448.362,7887.2


org.openjdk.jmh.samples.JMHSortBenchmark.abcdSort,5151.45,54545
org.openjdk.jmh.samples.JMHSortBenchmark.abcdSort,951.5,4512.5

因为我想处理它们的值之间的差异并比较它们,即 list1 中的 888.2,2115 和 map2 中的 7448.362,7887.2,从而将差异记录到 csv 文件中。

我使用了以下代码:

public static List<DataSt> outputComparator(List<DataSt> list1, List<DataSt> list2) {

        List<DataSt> map4 = new ArrayList<DataSt> ();

        for (DataSt  entry: list1) {
            if (list2.contains(entry.key)) {
                saveRecord(entry, **//Here I want to return DataSt of list2//**,entry.key,map4);
            } else {
                saveRecord(entry.key, map4);
            }
        }

        for (DataSt entry: list2) {
            if (!(list1.contains(entry.key))) {
                saveRecord(entry.key, map4);
            }
        }
        return map4;
    }

语句"saverecord" 中的"entry" 为该运行返回"list1.key, list1.time, list1.value"

这里我不知道如何获得"DataSt part of list2"。有人可以帮我在"list1.key == list2.key" 时如何检索"list2.key, list2.time, list2.value"(请参阅 saveRecord() 中的注释字段)。

【问题讨论】:

  • list2.contains(entry.key) 将始终为假,因为list2 包含DataSt 类型的对象,而entry.key 是String,它们永远不会相等。 --- 看到名为 map4 的 List 也很奇怪,特别是因为实际的 Map&lt;String, DataSt&gt; 更容易用于此目的。
  • 如果list2 中的列表元素等于entry.key,list2.contains(entry.key) 返回true。由于list2 的元素是DataSt,而entry.key 是String,它们永远不会相等,list2.contains(...) 总是返回 false。
  • 谁要求你改变它,为什么?
  • 另外,如果您需要List,这并不意味着您不能同时拥有Map。我遇到过不止一种情况,我需要在两个集合中保留相同的数据。
  • “是否不可能比较两个列表并检索值”...如果没有Map 或Set,这是可能的,但效率低且笨重。

标签: java list csv arraylist key


【解决方案1】:

list2.contains(entry.key) 不会做你认为的那样。它不知道DataSt.key 实际上是一把钥匙。您正在尝试将 String 对象与 DataSt 对象匹配(这永远不会起作用)。

您可以覆盖 equals 以仅比较密钥,或者您可以编写自己的 DataSt findItem(ArrayList&lt;DataSt&gt; list, String key)

如果您确实需要键控数据,您可以查看一个不同的结构,您可以在其中通过键实际查找。

【讨论】:

  • 覆盖equals 似乎是个坏主意。还有更好的方法。
  • 在我看来,建议继续对列表进行顺序搜索是不好的形式。
  • @Andreas 所以我将两个列表都复制到了两个新的 哈希映射,其中 ListSt 有时间和内存。有了这个,我得到了我的问题的答案。这是最好的方法吗?
  • @Andreas 看看codereview.stackexchange.com/questions/171178/…,如果有的话请提出优化建议....
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-31
  • 1970-01-01
  • 1970-01-01
  • 2015-03-14
  • 2023-03-11
  • 2021-10-05
相关资源
最近更新 更多