我有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;
}
}
答案 0 :(得分:4)
您在LinkedList
处使用原始形式:
private List<LinkedList> buckets;
因此,removeLast
将返回Object
,而非Integer
。尝试
private List<LinkedList<Integer>> buckets;
和
buckets = new ArrayList<LinkedList<Integer>>();
将removeLast
的回复转换为Integer
是使这一点发挥作用的前仿制方法。但是,您从未在每个LinkedList
中插入任何项目,因此removeLast
会返回null
。如果您想要返回某些内容,请先在插入LinkedList
的{{1}}中添加内容。
转换为buckets
仍然有效,但提供Integer
作为Integer
的类型参数是首选,尤其是因为您通过提供LinkedList
作为类型来使用泛型参数已经LinkedList
。
答案 1 :(得分:2)
在你的嵌套循环中,
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
答案 2 :(得分:0)
您插入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);
}