繁体   English   中英

将整数添加到ArrayList <Integer>

[英]Adding Integers to ArrayList<Integer>

我有一个LinkedListArrayList (一个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM