简体   繁体   English

如何正确创建ArrayLists的ArrayList?

[英]How to correctly create an ArrayList of ArrayLists?

I am trying to create an ArrayList of ArrayLists. 我正在尝试创建ArrayLists的ArrayList。 I want to create 25 ArrayLists and have those ArrayList hold different values. 我想创建25个ArrayLists并使这些ArrayList保持不同的值。 The goal being to create a sorted dictionary by word length. 目标是按字长创建排序字典。

My code looks like 我的代码看起来像

    for(int i = 0; i < 25; i++)
         list2D.add(list);
    for(int i = 0; i < stringList; i++)
         list2D.get(stringList.get(i).length()).add(stringList.get(i))

The problem is that every list contains the same values after it finishes. 问题是每个列表在完成后都包含相同的值。

I know why the problem is happening. 我知道问题发生的原因。 "list" is an ArrayList, ArrayList's are objects and if you edit an object then everything containing that object will be edited. “list”是一个ArrayList,ArrayList是对象,如果你编辑一个对象,那么将编辑包含该对象的所有内容。

To fix the problem I tried 为了解决我试过的问题

    for(int i = 0; i < 25; i++){
        list = new ArrayList<String>();
        for(int i2 = 0; i2 < stringList.size(); i2++){
            if(stringList.get(i).length() == i)
                list.add(stringList.get(i2));
        }
        list2D.add(list);
    }

But when I test my "list2D" 但是当我测试我的“list2D”时

    for(int i = 0; i < 25; i++)
         System.out.print(list2D.get(i).size()+" ");

I get 我明白了

0 0 0 0 0 58110 0 58110 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 58110 0 58110 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

and I have no idea why... 我不明白为什么......

Also it might be relevant to note that stringList contains 58110 values. 另外值得注意的是stringList包含58110个值。

Also I don't want to have to make 25 different ArrayLists! 另外,我不想制作25种不同的ArrayLists!

I would try the following to do a single pass of the stringList 我会尝试以下方法来执行stringList的单次传递

List<List<String>> dict = new ArrayList<>();
for(string s: stringsList) {
    int len = s.length();
    // add new array lists as required, could be any length, assuming << 100
    while(dict.size() <= len) dict.add(new ArrayList<String>());
    // add the string to the right list.
    dict.get(len).add(s);
}

This is easy. 这很简单。 For example, you can create them like this: http://ideone.com/3NZwWU 例如,您可以像这样创建它们: http//ideone.com/3NZwWU

// just for convenience, initializes arraylist with values
static <T> ArrayList<T> AL(T... values) {
    ArrayList<T> r = new ArrayList<T>();
    for (T x : values) {
        r.add(x);
    }
    return r;
}

public static void main (String[] args) throws java.lang.Exception
{
    System.out.println(AL(
        AL(3,2,24,131),
        AL("this", "is", "second", "array")));
    // prints `[[3, 2, 24, 131], [this, is, second, array]]`

}

Thanks. 谢谢。 I found a really easy solution though... 我找到了一个非常简单的解决方案......

for(int i = 0; i < 25; i++)
    list2D.add(new ArrayList<String>());
for(int i = 0; i < word.size(); i++)
    list2D.get(stringList.get(i).length()).add(stringList.get(i));

//makes an arraylist with 19 arraylist elements //使用19个arraylist元素制作一个arraylist

  ArrayList<ArrayList> arrList = new ArrayList<ArrayList>();
  for(int i = 1; i < 20; i++){
     arrList.add(new ArrayList<Integer>(5*i+5));
  }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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