在数组中查找不匹配的元素子集-java
给定2个字符串值数组,例如:在数组中查找不匹配的元素子集-java,java,arrays,Java,Arrays,给定2个字符串值数组,例如: String[] a1 = {"A", "B", "C"} String[] a2 = {"A", "B"}; 一个数组( A1 < /代码>)包含所有可用的字符串值,另一个数组( A2< /代码>)包含我不想考虑的值,我如何返回一个数组,其中包含的元素不包含在 A2中?p> 约束条件: 1> a1和a2将始终包含唯一的有效值,即a2中的任何值将始终是a1中的值,因此a1和a2之间永远不会存在不匹配 2> a2可以是空数组 以下是我的想法: List<
String[] a1 = {"A", "B", "C"}
String[] a2 = {"A", "B"};
一个数组(<代码> A1 < /代码>)包含所有可用的字符串值,另一个数组(<代码> A2< /代码>)包含我不想考虑的值,我如何返回一个数组,其中包含的元素不包含在<代码> A2中?p>
约束条件:
1>
a1
和a2
将始终包含唯一的有效值,即a2
中的任何值将始终是a1
中的值,因此a1
和a2
之间永远不会存在不匹配2>
a2
可以是空数组
以下是我的想法:
List<String> nonMatch = new ArrayList<String>(a1.length - a2.length);
for (String a : a2)
{
if (Arrays.binarySearch(a1, a) < 0)
{
nonMatch.add(a);
}
}
return nonMatch.toArray();
List nonMatch=newarraylist(a1.length-a2.length);
用于(字符串a:a2)
{
if(Arrays.binarySearch(a1,a)<0)
{
不匹配。添加(a);
}
}
返回nonMatch.toArray();
但我想知道是否有更好的解决方案,而不会降低性能我认为a可能是最好的方式
Set<String> diff = new HashSet<String>(Arrays.asList(a1));
diff.removeAll(Arrays.asList(a2));
Set diff=newhashset(Arrays.asList(a1));
diff.removeAll(Arrays.asList(a2));
我会使用一个-可能是一个哈希集。例如:
Set<String> results = new HashSet<String>(Arrays.asList(a1));
results.removeAll(Arrays.asList(a2));
return results; // Convert to an array if you really must
。。。但总的来说,这是一个非常有用的图书馆
编辑:要保留顺序,请使用LinkedHashSet
:
Set results=newlinkedhashset(Arrays.asList(a1));
结果:removeAll(Arrays.asList(a2));
返回结果;//如果确实需要,请转换为数组
您可以先对数组进行排序,然后只迭代一次,这样就不必搜索a2中的每一个字符串,因为此时无法编译(您尝试在第二条语句中实例化一个接口,而第一条语句尝试使用一个不存在的构造函数)。此外,无需从a2
开始创建一个集合-removeAll
可以处理任何集合。@JonSkeet:正如您所说的那样,正在修复commentingFair。当你编辑你的答案时,我之前对我答案的编辑似乎在以太中迷失了方向:(谢谢你的建议。由于需求的变化,我必须保持非匹配元素的顺序与上面数组a1
中的顺序相同。因此如果a1={“a”,“B”,“C”,“D”}
和a2={“B”,“C”}
,结果数组的顺序应始终为{“A”,“D”}
用于处理。如果我们使用的是集合
,我相信处理的顺序不会得到维护。@darkie15:这取决于你使用的集合-你可以使用一个保持顺序的LinkedHashSet
。@驴子:请不要使用注释来引起对无关问题的注意。
Set<String> results = Sets.newHashSet(a1);
results.removeAll(Arrays.asList(a2));
return results;
Set<String> results = new LinkedHashSet<String>(Arrays.asList(a1));
results.removeAll(Arrays.asList(a2));
return results; // Convert to an array if you really must