java - 存储字符串数组唯一列表的最佳方式

标签 java arrays string collections

我有可能有重复条目的字符串数组列表。我想从这些值中获取唯一列表。

我有一个字符串数组列表,每个数组都有两个字符串值。

示例字符串数组值:

{"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 上相关问题的答案中,我了解到如果需要,必须覆盖 hashcodeequal 方法。但是,如果那是我所缺少的,我不确定在我的情况下我该怎么做?

此外,如果您有任何其他建议可以更好地唯一存储字符串数组,请告诉我。

问候,

鲁米特

最佳答案

您可以使用 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/

相关文章:

java - 无法实例化 UriInfo 指定的类是接口(interface)

java - 哪个更快? Integer.valueOf(String string) 还是 Integer.parseInt(String string)?

java - 如何使用GridLayout在Java中将中心组件设置在固定位置?

java - 命令行中的命令行参数与 IDE 中的命令行参数

string - 在 Bash 中用另一个字符替换一个字符

c# - 字符串数组拆分 - 字符串 [] 到字符串错误

C#/TypeScript 字节数组在发送到客户端时得到编码

java - 为什么我的数组不打印出我的输入?

javascript - 为什么在 innerHTML 中使用 Array#map 输出中的额外逗号?

c# - 如何仅在整个文本被括号包围时才删除括号?