将整数添加到 ArrayList<Integer>
Posted
技术标签:
【中文标题】将整数添加到 ArrayList<Integer>【英文标题】:Adding Integers to ArrayList<Integer> 【发布时间】:2015-01-07 08:39:41 【问题描述】:我有一个ArrayList
的LinkedList
s(链表数组)。 LinkedList
s 包含整数 (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;
【问题讨论】:
如果您将buckets
声明为List<LinkedList<Integer>> buckets
,这将起作用。使用List<List<Integer>> 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
的类型参数来使用泛型。
【讨论】:
感谢您的回答。添加在你的嵌套循环中,
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 的有效使用
【讨论】:
谢谢!我的i
和j
变量被切换了。那个简单的编辑就成功了。虽然,您的两个建议都使代码更清晰、更容易理解,所以我将使用这些实现中的一个。出于好奇,使用迭代器而不是循环遍历大小有什么好处?
@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>的主要内容,如果未能解决你的问题,请参考以下文章
如何从整数arraylist.ANDROID中删除值[重复]
将 ArrayList<Integer> 转换为 int[] 的最快方法 [重复]