[英]Adding Integers to ArrayList<Integer>
我有一个LinkedList
的ArrayList
(一个LinkedList
的数组)。 LinkedList
包含整数( Integer
)。
private List<LinkedList> buckets;
buckets = new ArrayList<LinkedList>();
for (int i = 0; i < 10; i++) {
LinkedList<Integer> temp = new LinkedList<Integer>();
buckets.add(temp);
}
我后来想要从链表中删除项目(按添加顺序)并将它们添加到数组列表中。 当我尝试这个:
ArrayList<Integer> sorted = new ArrayList<Integer>(unsorted.size());
for (int i = 0; i < buckets.size(); i++) {
for (int j = 0; j < buckets.get(i).size(); j++) {
sorted.add(buckets.get(j).removeLast());
// sorted.add((Integer)buckets.get(j).removeLast());
}
}
我收到一个错误说:
add(java.lang.Integer) in ArrayList cannot be applied to (java.lang.Object)
但是当我将它转换为Integer
(注释掉的行)时,数组中充满了null values
。 有谁看到我做错了什么?
这是我向bucket
添加项目的地方:
for (int i = 0; i < unsorted.size(); i++) {
int digit = (unsorted.get(i) / position) % 10;
buckets.get(digit).add(unsorted.get(i));
}
请注意, sorted
是一个ArrayList<Integer>
。 当我在调试模式下跟踪它时,我可以看到LinkedLists具有正确值的Integer对象。
存储桶内容的屏幕截图:
工作实例:
class Ideone {
private static List<LinkedList<Integer>> buckets;
public static void main (String[] args) throws Exception {
ArrayList<Integer> arr = new ArrayList<Integer>();
arr.add(6);
arr.add(8);
arr.add(1);
arr.add(3);
arr.add(9);
System.out.println(arr);
arr = sort(arr);
System.out.println(arr);
}
public static ArrayList<Integer> sort(ArrayList<Integer> unsorted) {
buckets = new ArrayList<LinkedList<Integer>>();
for (int i = 0; i < 10; i++) {
LinkedList<Integer> temp = new LinkedList<Integer>();
buckets.add(temp);
}
ArrayList<Integer> sorted = new ArrayList<Integer>(unsorted.size());
for (int i = 0; i < unsorted.size(); i++) {
int digit = unsorted.get(i) % 10;
buckets.get(digit).add(unsorted.get(i));
}
for (int i = 0; i < buckets.size(); i++) {
for (int j = 0; j < buckets.get(i).size(); j++) {
sorted.add(buckets.get(j).poll());
// sorted.add((Integer)buckets.get(j).removeLast());
}
}
return sorted;
}
}
您在这里使用LinkedList
的原始形式:
private List<LinkedList> buckets;
因此, removeLast
将返回Object
,而不是Integer
。 尝试
private List<LinkedList<Integer>> buckets;
和
buckets = new ArrayList<LinkedList<Integer>>();
将removeLast
的返回转换为Integer
是使这种方法起作用的前泛型方法。 但是,您从未在每个LinkedList
插入任何项,因此removeLast
返回null
。 如果你想要返回的东西,首先在插入到buckets
每个LinkedList
中插入一些东西。
转换为Integer
仍然有效,但是首选将Integer
作为LinkedList
的类型参数提供,尤其是因为您通过将LinkedList
作为类型参数提供给List
已经使用泛型。
在你的嵌套循环中,
for (int i = 0; i < buckets.size(); i++) {
for (int j = 0; j < buckets.get(i).size(); j++) {
// ***** here *****
sorted.add(buckets.get(j).poll());
}
}
您希望轮询错误的列表。
尝试改变
sorted.add(buckets.get(j).poll());
至:
sorted.add(buckets.get(i).poll());
也许更清晰,更直观的编码方式如下:
for (int i = 0; i < buckets.size(); i++) {
LinkedList<Integer> innerList = buckets.get(i);
for (int j = 0; j < innerList.size(); j++) {
sorted.add(innerList.poll());
}
}
虽然如果innerList有多个项目,这可能不起作用。 为什么不用迭代器安全地删除项目?
for (int i = 0; i < buckets.size(); i++) {
LinkedList<Integer> innerList = buckets.get(i);
for (Iterator<Integer> iterator = innerList.iterator(); iterator.hasNext();) {
sorted.add(iterator.next());
iterator.remove(); // this guy is optional
}
}
或者只是use get(j)
for (int i = 0; i < buckets.size(); i++) {
LinkedList<Integer> innerList = buckets.get(i);
for (int j = 0; j < innerList.size(); j++) {
sorted.add(innerList.get(j));
}
}
虽然这不是有效使用LinkedList
您插入到ArrayList“sorted”中的项目是您从链接列表LinkedList中获取的项目。
但你从来没有真正添加任何项目。 您只需创建一个LinkedList并将其添加到您的存储桶列表中。
您需要在临时列表中添加一些内容。
for (int i = 0; i < 10; i++) {
LinkedList<Integer> temp = new LinkedList<Integer>();
// Add something to the temp LinkedList
buckets.add(temp);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.