将整数添加到ArrayList <integer> </integer>

时间:2014-11-10 22:16:28

标签: java arrays object arraylist linked-list

我有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));
}

请注意,sortedArrayList<Integer>。当我在调试模式下跟踪它时,我可以看到LinkedLists具有正确值的Integer对象。

存储桶内容的屏幕截图:

Bucket contents debug output

工作示例:

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;
    }
}

3 个答案:

答案 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);
}