rum*_*tel 1 java arrays string collections
我有可能有重复条目的字符串数组列表.我想从这些值中获取唯一列表.
我有一个字符串数组列表,每个数组都有两个String值.
示例字符串数组值:
{"error message 1", "fail"}
{"error message 2", "N/A"}
{"error message 1", "fail"} // duplicate
{"error message 2", "fail"}
Run Code Online (Sandbox Code Playgroud)
我单独从JSON元素中获取"错误消息1"和"失败"字符串,然后将它们添加到String数组对象中.现在我想要这个数组的独特组合.所以,如果我有上面的4个数组,我想要只有三个唯一条目的列表.
从互联网搜索,我深入研究使用HashSet作为我的用例(顺序无关紧要).但是,HashSet会将所有4个条目添加到集合中.我甚至尝试使用' contains '来检查对象是否已经存在,但这也不起作用.我相信,这是因为contains方法是比较' reference '而不是' value '.这是HashSet添加重复值的原因吗?
我将这些String数组添加到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.
Run Code Online (Sandbox Code Playgroud)
从关于SO的相关问题的答案,我理解,如果需要,必须覆盖哈希码和相等的方法.但是,我不确定如果那是我所缺少的,我将如何做到这一点呢?
另外,如果您有任何其他建议可以更好地存储String数组,请告诉我.
问候,
Rumit
您可以使用Lists而不是数组.如果您在使用列表java.util包,他们应该已经落实hashCode(),并equals(Object)在适合您的需要(深equals和深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
Run Code Online (Sandbox Code Playgroud)