我正在尝试在代码战中挑战:https://www.codewars.com/kata/554ca54ffa7d91b236000023/train/java 我将原始数组更改为arraylist,但随后必须使用arrayist中的值与原始类型进行一些比较。
我尝试使用(int)强制转换Integer对象,但仍然存在强制错误。当我尝试执行(int)(arrList.get(j))。equals(current)时,它告诉我布尔值无法转换为int。
import java.util.*;
public class EnoughIsEnough {
public static int[] deleteNth(int[] elements, int maxOccurrences) {
ArrayList arrList = new ArrayList<>(Arrays.asList(elements));
for (int i = 0; i < arrList.size(); i++) {
int current = (int)arrList.get(i);
int occurrences = 1;
for (int j = i + 1; j < arrList.size(); j++) {
if (arrList.get(j).equals(current) && occurrences >= maxOccurrences) {
arrList.remove(j);
} else if (arrList.get(j).equals(current)) {
occurrences++;
}
}
}
int arr[] = new int[arrList.size()];
for (int i = 0; i < arrList.size(); i++) {
arr[i] = (int) arrList.get(i);
}
return arr;
}
}
它已编译,但测试显示:类[无法将其强制转换为类java.lang.Integer([I和java.lang.Integer在加载程序'bootstrap'的模块java.base中)
答案 0 :(得分:1)
Arrays.asList(elements)
并没有您所想的那样,它返回一个包含int []数组而不是数组元素的列表。您无法创建基元列表。如果要使用列表,必须首先将int
转换为Integer
。
您可以通过以下方式获取Integer
的列表
List<Integer> arrList = Arrays.stream(elements).boxed().collect(Collectors.toList());
但是,您的程序中仍然存在一个错误,您将跳过数字。
for (int j = i + 1; j < arrList.size(); j++) {
if (arrList.get(j).equals(current) && occurrences >= maxOccurrences) {
arrList.remove(j); // This shortens the list causing us to skip the next element
j--; // One hackish way is to go back one step
} else if (arrList.get(j).equals(current)) {
occurrences++;
}
}
一种解决方案是改为向后循环
for (int j = arrList.size() - 1; j > i; j--) {
if (arrList.get(j).equals(current) && occurrences >= maxOccurrences) {
arrList.remove(j);
} else if (arrList.get(j).equals(current)) {
occurrences++;
}
}
答案 1 :(得分:0)
您可以替换
ArrayList arrList = new ArrayList<>(Arrays.asList(elements));
使用
List<Integer> arrList = Arrays.stream(elements).boxed().collect(Collectors.toList());