我有可能有重复条目的字符串数组列表。我想从这些值中获取唯一列表。
我有一个字符串数组列表,每个数组都有两个字符串值。
示例字符串数组值:
{"error message 1", "fail"}
{"error message 2", "N/A"}
{"error message 1", "fail"} // duplicate
{"error message 2", "fail"}
我分别从 JSON 元素中获取 “错误消息 1” 和 “失败” 字符串,并将它们添加到一个字符串数组对象中。现在我想要这个数组的独特组合。所以,如果我有上面的 4 个数组,我想得到只有三个唯一条目的列表。
从 Internet 搜索中,我深入了解如何将 HashSet 用于我的用例(顺序无关紧要)。但是,HashSet 将所有 4 个条目添加到集合中。我什至尝试使用“包含”来检查对象是否已经存在,但这也不起作用。我相信,这是因为 contains 方法比较的是“reference”而不是“value”。这是 HashSet 添加重复值的原因吗?
我将这些字符串数组添加到 HashSet 的代码是
Set<String[]> uniqueSet = new HashSet<String[]>();
if(!uniqueSet.contains(new String[] {errorMessage,result})) // I get errorMessage and result as separate Strings
uniqueSet.add(new String[] {errorMessage,result}); // I expect to have only 3 values here in the uniqueSet. But it adds all 4.
从 SO 上相关问题的答案中,我了解到如果需要,必须覆盖 hashcode 和 equal 方法。但是,如果那是我所缺少的,我不确定在我的情况下我该怎么做?
此外,如果您有任何其他建议可以更好地唯一存储字符串数组,请告诉我。
问候,
鲁米特
最佳答案
您可以使用 List
而不是数组。如果您使用 java.util
包中的列表,它们应该已经以适合的方式实现了 hashCode()
和 equals(Object)
您的需求(深度等于和深度 hasCode):
String[][] stringArrays = new String[][] {
{"error message 1", "fail"},
{"error message 2", "N/A"},
{"error message 1", "fail"}, // duplicate
{"error message 2", "fail"}
};
Set<List<String>> uniqueSet = new HashSet<List<String>>();
for (String[] a : stringLists) {
uniqueSet.add(Arrays.asList(a));
}
// uniqueSet.size() should return 3 here
关于java - 存储字符串数组唯一列表的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24520445/