我有几个不同大小的数组;说,阵列A和阵列B。比较和匹配不同大小的数组
Array A
[奇瑞,奇瑞,uindy,奇瑞,奇瑞]
Array B
[奇瑞,uindy]
需要检查是否存在于数组值A可用在数组B或不。在上面的例子中,Array A中的所有值在Array B中都可用。请使用Java代码来解决这个问题。谢谢!
我有几个不同大小的数组;说,阵列A和阵列B。比较和匹配不同大小的数组
Array A
[奇瑞,奇瑞,uindy,奇瑞,奇瑞]
Array B
[奇瑞,uindy]
需要检查是否存在于数组值A可用在数组B或不。在上面的例子中,Array A中的所有值在Array B中都可用。请使用Java代码来解决这个问题。谢谢!
您可以将阵列转换为List
,然后使用containsAll
方法,看是否有特定的列表包含在另一个列表中所描述的所有元素。
如果它们是Set
s,您会得到更好的性能。
实施例:
List<String> firstList = Arrays.asList("chery", "chery", "unid", ...);
List<String> secondList = Arrays.asList("chery", "unid", ...);
System.out.println(secondList.containsAll(firstList));
如果特别是在本方法的性能是有点不可靠的,则考虑将所述列表分成Set
š代替:
Set<String> firstSet = new HashSet<>(Arrays.asList("chery", "chery", "unid", ...));
我个人认为'Set'在这里更合适。至少把'firstList'改成'Set' –
如果性能成为一个问题,那么是的,这是一个完全合理的做法。以上更具说明性,而不是复制粘贴的有效代码,但我会修改我的答案以包含转换为“Set”。 – Makoto
刚刚看到了这个逻辑的一个缺陷:OP询问'数组A中存在的值是否可用于数组B',这意味着他正试图找出A和B的不同值,B是A的超集。你的回答是做相反的 –
字符串的数组:
for (String str : array1)
{
System.out.println(ArrayUtils.contains(array2, str);
}
数组是不这样做的好数据结构。 A Set
比较好。因此,将您的两个阵列转换为Set
对象,然后只需使用Set.equals()
。或者在比较之前创建新对象,或者在任何地方使用Set
。
对话应该实际上是转换他re =) –
dunno downvote的原因,但这确实是这里最好的答案 –
我会避开'Set#equals';不能保证平等的条件永远成立。如果一组是另一组的适当子集,那么它们不可能是等价的。 – Makoto
Set<String> setA = new HashSet<>(Arrays.asList(new String[]{"chery", "chery", "uindy", "chery", "chery"}));
Set<String> setB = new HashSet<>(Arrays.asList(new String[]{"chery", "uindy"}));
System.out.println("Sets are equal: " +setA.equals(setB));
的equals
方法的AbstractSet
说
将指定的对象与此集相比较。如果给定的对象也是一个集合,则返回true ,这两个集合具有相同的大小, 并且给定集合的每个成员都包含在此集合中。这个 确保equals方法在Set接口的不同 实现中正常工作。如果指定的对象是这个集合,这个实现首先检查 ;如果是的话,它返回true。然后, 检查指定的对象是否是一个大小与该集合的大小相同的集合;如果不是,则返回false。如果是,则返回 containsAll((Collection)o)。
设置等值不是这里最好的解决方案。显示的示例数据让你认为,但如果一个集合是另一个集合的正确子集(即A Makoto
在这个例子中,我使用整数,但也可以用于其他类型的小修改。 首先在阵列A元素上放置一个循环。
for(int i =0; i<A.length(); i++)
{
//this loop will transverse with all elements in array A.
}
现在内部for循环进行另一个为环,其横向穿过环B的元素
for(int i =0; i<A.length(); i++)
{
for(int j=0; j<B.length();j++)
{
if(A[i] == B[j])
{ System.out.println("this element is in array A and B"); }
}
}
现在,如果您想检查A的所有元素是否都在B中,您可以创建一个布尔值。这个布尔值是真的,只要你发现一个元素不存在于你可以退出的两个数组上,那么A中的每个元素都至少在B中找到一次。
根据您的要求,您将查明B
是否为A
(我的意思是不同的值)的超集。
这可以通过一个线可以轻松完成这样的:
String[] aArr = {.....};
String[] bArr = {.....};
return new HashSet<String>(Arrays.asList(bArr)).containsAll(Arrays.asList(aArr));
简言之,使B
一个Set
,并检查是否B set
包含A
所有值,因此,如果A = {Apple, Apple, Banana, Cherry}
和B = {Apple, Banana, Cherry, Pineapple}
,它会返回true(这是你的描述的行为基础)
看看ArrayUtils.contain() –