Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在数组中查找不匹配的元素子集-java_Java_Arrays - Fatal编程技术网

在数组中查找不匹配的元素子集-java

在数组中查找不匹配的元素子集-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<

给定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> 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