将整数添加到 ArrayList<Integer>

Posted

技术标签:

【中文标题】将整数添加到 ArrayList<Integer>【英文标题】:Adding Integers to ArrayList<Integer> 【发布时间】:2015-01-07 08:39:41 【问题描述】:

我有一个ArrayListLinkedLists(链表数组)。 LinkedLists 包含整数 (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&lt;Integer&gt;。当我在调试模式下跟踪它时,我可以看到 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;
    

【问题讨论】:

如果您将buckets 声明为List&lt;LinkedList&lt;Integer&gt;&gt; buckets,这将起作用。使用List&lt;List&lt;Integer&gt;&gt; buckets 会更好。 谢谢,我已经这样做了,它修复了错误,但我仍然得到空值。 请重新阅读mcve 链接和协议。您不应该在此处发布链接,而是在您的问题中发布实际工作代码。 知道了,从现在开始我会这样做。谢谢。 【参考方案1】:

您在此处使用LinkedList 的原始形式:

private List<LinkedList> buckets;

因此,removeLast 将返回 Object,而不是 Integer。试试

private List<LinkedList<Integer>> buckets;

buckets = new ArrayList<LinkedList<Integer>>();

removeLast 的返回值转换为Integer 是使其工作的前泛型方式。但是,您从未在每个LinkedList 中插入任何项目,因此removeLast 返回null。如果你想返回一些东西,首先在每个LinkedList 中插入一些东西,然后再插入buckets

转换为Integer 仍然有效,但提供Integer 作为LinkedList 的类型参数是首选,特别是因为您已经通过提供LinkedList 作为List 的类型参数来使用泛型。

【讨论】:

感谢您的回答。添加 消除了错误,但我仍然得到空值。我实际上是在向 LinkedList 添加值,只是没有包含代码。我已经更新了这个问题。任何想法为什么我仍然为空?【参考方案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 的有效使用

【讨论】:

谢谢!我的ij 变量被切换了。那个简单的编辑就成功了。虽然,您的两个建议都使代码更清晰、更容易理解,所以我将使用这些实现中的一个。出于好奇,使用迭代器而不是循环遍历大小有什么好处? @SFBA26:迭代器更适合 LinkedList,因为它不涉及调用 get(...) 所需的随机访问。如果您从循环中删除项目,迭代器有助于避免并发修改异常。最后,如果桶中有多个项目,您的 poll() 代码将不起作用。 如果remove() 是可选的,为什么不使用for-each 循环:for (Integer j in buckets.get(i)) ...【参考方案3】:

您插入到 ArrayList “排序”的项目是您从链接列表 LinkedList 中获取的项目。

但您实际上从未向其中添加任何项目。您只需创建一个 LinkedList 并将其添加到您的存储桶列表中。

您需要在临时列表中添加一些内容。

for (int i = 0; i < 10; i++) 
    LinkedList<Integer> temp = new LinkedList<Integer>();
    // Add something to the temp LinkedList
    buckets.add(temp);

【讨论】:

感谢您的回答。我实际上是在向 LinkedList 添加值,只是没有包含代码。我已经更新了这个问题。任何想法为什么我仍然为空? 我添加了一个截图,内容为bucket

以上是关于将整数添加到 ArrayList<Integer>的主要内容,如果未能解决你的问题,请参考以下文章

24二叉树中和为某一值的路径

如何从整数arraylist.ANDROID中删除值[重复]

将 ArrayList<Integer> 转换为 int[] 的最快方法 [重复]

如何把数值或者对象添加到ArrayList集合

将 ArrayList 添加到另一个 ArrayList [重复]

将对象添加到 ArrayList<String>