如何检查一个ArrayList是否包含在另一个ArrayList中,并且这两个列表的大小不同
问题描述:
我已经编写了一个程序的代码,该程序需要两个列表,并且如果第二个数组的所有元素也出现在第一个列表中阵列。然而,这段代码只适用于两个大小相等的数组(例如{1,2,3}和{3,2,1}返回true),但如果第一个数组大于第二个数组,我会得到一个rangeCheck异常(完全期待这一点,公平)。如何检查一个ArrayList是否包含在另一个ArrayList中,并且这两个列表的大小不同
import java.util.*;
public class Ex8 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("How many numbers do you wish to enter into the
array?");
int thisMany = scanner.nextInt();
ArrayList<Integer> numbers = new ArrayList<Integer>();
System.out.println("Please enter some numbers, separated by
spaces");
for(int i = 0; i<thisMany; i++) {
int x = scanner.nextInt();
numbers.add(x);
}
Scanner sc = new Scanner(System.in);
System.out.println("How many numbers do you wish to enter into the
second array?");
int nowThisMany = sc.nextInt();
ArrayList<Integer> numbers2 = new ArrayList<Integer>();
System.out.println("Enter some numbers, separated by spaces");
for(int j = 0; j<nowThisMany; j++) {
int y = sc.nextInt();
numbers2.add(y);
}
System.out.println(Arrays.toString(numbers.toArray()));
System.out.println(Arrays.toString(numbers2.toArray()));
isContained(numbers, numbers2);
System.out.println(isContained(numbers, numbers2));
}
public static boolean isContained(ArrayList<Integer> numbers,
ArrayList<Integer> numbers2) {
boolean equalsTest = false;
for(int i = 0; i<numbers.size(); i++) { //This gives exception if
//both arrays aren't the same size
if(numbers.get(i) == numbers2.get(i)) {
equalsTest = true;
}
}
return equalsTest;
}
}
任何人都可以向我解释如何检查第二个数组与第一个数组没有运行异常?谢谢
答
如果{1,2,3}和{3,2,1}使用您当前的代码返回true,我会感到惊讶。由于您正在检查numbers2
中的每个项目都在numbers
中,因此请重复numbers2
并检查每个项目是否在numbers
之间。
public static boolean isContained(ArrayList<Integer> numbers,
ArrayList<Integer> numbers2) {
outer:
for(int i = 0; i<numbers2.size(); i++) {
for(int j = 0; j<numbers.size(); j++){
if(numbers2.get(i) == numbers.get(j)){
continue outer;
return false;
return true;
答
你会得到异常,因为你不检查哪个数组较大。你可以增加,如果这样的语句:
public static boolean isContained(ArrayList<Integer> numbers,
ArrayList<Integer> numbers2) {
boolean equalsTest = false;
if(numbers.size() > numbers2.size()){
for(int i = 0; i<numbers.size(); i++) {
if(numbers.get(i) == numbers2.get(i)) {
public static boolean isContained(ArrayList<Integer> numbers, ArrayList<Integer> numbers2) {
boolean equalsTest = false;
for(int i = 0; i<numbers.size(); i++) {
if(numbers.get(i) == numbers2.get(i)) {
equalsTest = true;
}
}
return equalsTest;
}
equalsTest = true;
}
}
return equalsTest;
}
else ;// Here add a logic of checking if the second list is larger
}
答
由于经常与寻求帮助的情况下,我找到了解决方案来给你张贴的问题后几分钟。
无论如何,我设法解决了嵌套的for循环使用int j
通过第二个列表的问题。这是我在isContained
方法使用的代码:
public static boolean isContained(ArrayList<Integer> numbers,
ArrayList<Integer> numbers2) {
boolean equalsTest = false;
for(int i = 0; i<=numbers.size()-1; i++) {
for(int j = 0; j<=numbers2.size()-1; j++) { //This second for loop goes through the elements of the second List separately without causing an exceptoion
if(numbers.get(i) == numbers2.get(j)) {
equalsTest = true;
break;
}
}
}
return equalsTest;
}
答
与您的代码的问题出现在行:
if(numbers.get(i) == numbers2.get(i)) {
考虑,当大小不相等,你不能这样做,因为当你的第一个数组包含5个elemnts和第二阵列包含2个elemants有你在哪里试图比较
if(numbers.get(3) == numbers2.get(3)) {
其中numbers2没有该元素的情况下,这就是为什么你得到错误, 如果你想检查数组包含另外一个简单的方法是使用
boolean Collection.containsAll(Collection<?> c);
,但如果你想编写自己的代码,请确保您正在考虑以下几个方面,并更新您的代码:
- 考虑数组的大小,您应该搜索较大的数组中的较小阵列 !
- 小尺寸阵列中的每个元素,检查大数组包含它,如果你发现在大 阵去下一个(小型阵列的下一个元素)的元素,
- 如果小数组的元素在大阵中没有找到结果是 假的,所以你可以返回false,而忽略寻找其他
- 如果小阵的所有元素都成立于大阵 答案是真的,
'布尔集合.containsAll(集合> c);' – davidxxx