线程 "main" java.lang.IndexOutOfBoundsException 中的异常:源不适合目标
Exception in thread "main" java.lang.IndexOutOfBoundsException: Source does not fit in dest
我有对象:
static class Truck {
ArrayList<Integer> route = new ArrayList<Integer>();
double weight = 0;
int route_weight = 0;
Truck() {
}
Truck(ArrayList<Integer> route) {
Collections.copy(this.route, route);
}
//getters and setters
}
进入此列表的对象:
static ArrayList<Truck> trucks=new ArrayList<Trucks>();
我正在尝试制作列表的完整副本:
ArrayList<Truck> copy=new ArrayList<>();
copy=cloneList(trucks);
public static ArrayList<Truck> cloneList(ArrayList<Truck> trucksList) {
ArrayList<Truck> clonedList = new ArrayList<Truck>();
for (Truck truck : trucks) {
Truck w=new Truck(truck.getroute());
clonedList.add(w);
}
return clonedList;
}
但是我收到一个错误:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Source does not fit in dest
getroute returns:
[0, 9, 11, 1, 15, 3, 0]
Collections.copy
要求目标列表的大小至少是源列表的大小。当您尝试进行复制时,您的 this.route
大小为 0,因此会出现异常。
改为使用addAll
:
Truck(ArrayList<Integer> route) {
this.route.addAll(route);
}
除了 greg-449 的回答之外,我想指出的是,不是在声明时直接创建 ArrayList,您也可以在构造函数中创建它,利用 ArrayList
以另一个列表作为参数的构造函数。
这会将您的代码更改为:
Truck() {
this.route = new ArrayList<>();
}
Truck(ArrayList<Integer> route) {
this.route = new ArrayList<>(route);
}
新创建的列表将包含 route
列表中的所有元素,顺序相同。
我有对象:
static class Truck {
ArrayList<Integer> route = new ArrayList<Integer>();
double weight = 0;
int route_weight = 0;
Truck() {
}
Truck(ArrayList<Integer> route) {
Collections.copy(this.route, route);
}
//getters and setters
}
进入此列表的对象:
static ArrayList<Truck> trucks=new ArrayList<Trucks>();
我正在尝试制作列表的完整副本:
ArrayList<Truck> copy=new ArrayList<>();
copy=cloneList(trucks);
public static ArrayList<Truck> cloneList(ArrayList<Truck> trucksList) {
ArrayList<Truck> clonedList = new ArrayList<Truck>();
for (Truck truck : trucks) {
Truck w=new Truck(truck.getroute());
clonedList.add(w);
}
return clonedList;
}
但是我收到一个错误:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Source does not fit in dest
getroute returns:
[0, 9, 11, 1, 15, 3, 0]
Collections.copy
要求目标列表的大小至少是源列表的大小。当您尝试进行复制时,您的 this.route
大小为 0,因此会出现异常。
改为使用addAll
:
Truck(ArrayList<Integer> route) {
this.route.addAll(route);
}
除了 greg-449 的回答之外,我想指出的是,不是在声明时直接创建 ArrayList,您也可以在构造函数中创建它,利用 ArrayList
以另一个列表作为参数的构造函数。
这会将您的代码更改为:
Truck() {
this.route = new ArrayList<>();
}
Truck(ArrayList<Integer> route) {
this.route = new ArrayList<>(route);
}
新创建的列表将包含 route
列表中的所有元素,顺序相同。