如果一个集合(列表或集合)是另一个集合的子集,而元素(例如,1, 2,3,4 ,5等元素与大型集合不相邻),如果我想搜索2,3,4返回true,也可以2,5返回true,但4,2返回false,尽管4和2在集合中,但顺序不同,那么如何在Java (8)中找到
有实用工具帮我做这件事吗?或者一段代码做得很好?
谢谢
发布于 2016-11-01 16:32:45
如果a包含b,则此函数返回true。
此函数将集合转换为数组,如果您的集合类没有实现.toArray()函数,它将无法工作!
public class CollectionUtils {
private CollectionUtils() {
}
/**
* @return true if A contains B in order
*/
public static <T> boolean checkAcontainsB(Collection<T> a, Collection<T> b) {
if (a == null || b == null || b.size()>a.size()) {
return false;
}
if (b.isEmpty()) {
return true;
}
final Object[] aElements = a.toArray();
final Object[] bElements = b.toArray();
for (int i = 0; i < aElements.length; i++) {
int bIndex = 0;
for(int j = i; j< aElements.length; j++) {
if(aElements[j] == bElements[bIndex]) {
bIndex++;
if(bIndex>=bElements.length) {
return true;
}
}
}
}
return false;
}
}你可以测试它:
@Test
public void test() {
Assert.assertFalse(CollectionUtils.contains(Arrays.asList(1,2,3,4), Arrays.asList(2,3,4,5)));
Assert.assertTrue(CollectionUtils.contains(Arrays.asList(1,2,3,4), Arrays.asList(2,3,4)));
Assert.assertTrue(CollectionUtils.contains(Arrays.asList(1,2,3,4), Arrays.asList(2,4)));
Assert.assertTrue(CollectionUtils.contains(Arrays.asList(1,2,3,4,1,2,3,4), Arrays.asList(3,4,2)));
Assert.assertFalse(CollectionUtils.contains(Arrays.asList(1,2,3,4), Arrays.asList(2,3,4,5,6)));
}发布于 2016-11-01 16:21:04
没有经过充分的测试,但你可以尝试这样的方法,
int[] x = {1,2,3,4,5};
int[] y = {2,5};
int yIndex = 0;
for(int i: x){
if(y[yIndex] == i){
yIndex++;
if(yIndex >= y.length){
break;
}
}
}
System.out.println(yIndex == y.length ? "Match" : "Not Match");发布于 2016-11-01 16:27:27
您可以很容易地使用集合提供的一种实用程序方法,它完全可以完成您想要做的事情。
Collections.disjoint(c1, c2)如果传递的两个集合没有任何相同的项,则上面的方法返回true。这正是你想要的。
https://stackoverflow.com/questions/40363978
复制相似问题