下面是我的代码,在这里我想比较两个数组元素,并将对应的元素添加到新数组(foundArray
),而找不到其他数组(notFoundArray
)中的元素。
public static void main(String[] args) {
Integer[] originalArray = { 12, 54, 19, 20, 44, 32, 14, 63, 57, 28 };
Integer[] keyArray = { 20, 44, 50, 62, 23, 28, 19, 57, 60, 99 };
List<Integer> foundArray = new ArrayList<Integer>();
List<Integer> notFoundArray = new ArrayList<Integer>();
for (int i = 0; i <= originalArray.length; i++) {
for (int j = 0; j <= keyArray.length; j++) {
if (originalArray[i] == keyArray[j]) {
System.out.println("Found");
foundArray.add(originalArray[i]);
} else if (originalArray[i] != keyArray[j]) {
System.out.println("Not Found");
notFoundArray.add(originalArray[i]);
}
}
}
}
这是行不通的。它给了我ArrayIndexOutOfBoundsException
,并且只执行了else语句。我用Google搜索了它,但没有正确的答案。
感谢您的帮助。谢谢!
答案 0 :(得分:2)
ann数组的最后一个索引为length-1
,因为第一个索引为零,因此您的代码必须为
for (int i = 0; i < originalArray.length; i++) {
for (int j = 0; j < keyArray.length; j++) {
答案 1 :(得分:2)
我想您想将输入数组与键数组进行比较,顺序并不重要。
public static void main(String[] args) {
Set<Integer> originalArray = Arrays.asList(12, 54, 19, 20, 44, 32, 14, 63, 57, 28).stream().collect(Collectors.toSet());
Set<Integer> keyArray = Arrays.asList(20, 44, 50, 62, 23, 28, 19, 57, 60, 99).stream().collect(Collectors.toSet());
List<Integer> foundArray = new ArrayList<>();
List<Integer> notFoundArray = new ArrayList<>();
for (Integer i : originalArray) {
if (keyArray.contains(i)) {
foundArray.add(i);
} else {
notFoundArray.add(i);
}
}
System.out.println("Found");
foundArray.forEach(System.out::println);
System.out.println("Not found");
notFoundArray.forEach(System.out::println);
}
答案 2 :(得分:1)
我发现您的代码有两个问题。首先,循环界限不正确,因为大小为N
的数组最多只能寻址N-1
。其次,也许更重要的是,应该对内部原始循环 之后的每个原始编号进行簿记,而不是查找值内部。考虑到这两个因素:
for (int i=0; i < originalArray.length; i++) {
boolean found = false;
for (int j=0; j < keyArray.length; j++) {
if (originalArray[i] == keyArray[j]) {
System.out.println("Found");
found = true;
break;
}
}
if (found) {
foundArray.add(originalArray[i]);
}
else {
notFoundArray.add(originalArray[i]);
}
}
在当前方法中,您将向两个集合多次添加相同的初始编号。您最有可能不想这种行为。
答案 3 :(得分:1)
存在多个问题(用<=代替<和逻辑)。这应该起作用:
public static void main(String[] args) {
Integer[] originalArray = { 12, 54, 19, 20, 44, 32, 14, 63, 57, 28 };
Integer[] keyArray = { 20, 44, 50, 62, 23, 28, 19, 57, 60, 99 };
List<Integer> foundArray = new ArrayList<Integer>();
List<Integer> notFoundArray = new ArrayList<Integer>();
for (int i = 0; i < originalArray.length; i++) {
boolean found = false;
for (int j = 0; j < keyArray.length; j++) {
if (originalArray[i] == keyArray[j]) {
System.out.println("Found");
foundArray.add(originalArray[i]);
found = true;
break;
}
}
if(found == false) {
System.out.println("Not Found");
notFoundArray.add(originalArray[i]);
}
}
}
答案 4 :(得分:1)
public static void main(String[] args) {
Integer[] originalArray = { 12, 54, 19, 20, 44, 32, 14, 63, 57, 28 };
Integer[] keyArray = { 20, 44, 50, 62, 23, 28, 19, 57, 60, 99 };
List<Integer> foundArray = new ArrayList<Integer>();
List<Integer> notFoundArray = new ArrayList<Integer>();
for (int i = 0; i < originalArray.length; i++) {
for (int j = 0; j < keyArray.length; j++) {
if (originalArray[i] == keyArray[j]) {
System.out.println("Found");
foundArray.add(originalArray[i]);
}
}
}
}
这不会引发ArrayOfOfBoundsException,并且会为您提供所有找到的元素。 要获取未找到的元素,只需获取一个数组并将其与“ foundArray”进行比较。
答案 5 :(得分:1)
如果您对仅生成两个最终整数列表的Stream
版本感兴趣,此代码将执行此操作:
Set<Integer> keys = new HashSet<>(Arrays.asList(keyArray));
Map<Boolean, List<Integer>> partionedIntegers = Arrays.stream(originalArray).collect(Collectors.partitioningBy(keys::contains));
List<Integer> foundArray = partionedIntegers.get(true);
List<Integer> notFoundArray = partionedIntegers.get(false);
请注意,这将返回两个List<Integer>
,其中包含不同的Integer
,而问题中的代码将导致两个包含重复项的列表。
更多有关此代码的信息将适用于不同的数组长度。
并参考我对这个问题的评论:
HashSet.contains
将使用hashCode
和equals
,而不是对象身份(==
)来确定相等性。
答案 6 :(得分:1)
这也是使用Streams的另一个版本。
Integer[] originalArray = { 12, 54, 19, 20, 44, 32, 14, 63, 57, 28 };
Integer[] keyArray = { 20, 44, 50, 62, 23, 28, 19, 57, 60, 99 };
List<Integer> foundArray = new ArrayList<>();
List<Integer> notFoundArray = new ArrayList<>();
Stream.of(keyArray).forEach(p -> {
boolean result = Stream.of(originalArray).anyMatch(s -> s.intValue()==p.intValue());
if(result) {
foundArray.add(p);
}else {
notFoundArray.add(p);
}
});