JAVA使用对象填充临时Arraylist,然后将其添加到由arrayLists

时间:2015-07-22 19:01:40

标签: java arrays list multidimensional-array arraylist

我遍历一个由对象组成的数组。我想找到这个数组的某些部分,其中相同的特定对象相互跟随。

[a,b,c,#,#,#,h,g,a,#,#,s,#。h] - >我想找到#,#,#和#,#(#是特定对象)

我已经知道如何执行此操作:如果我找到'#',我会将此对象添加到临时ArrayList中。如果下一个对象也是'#',我也会添加它,否则我会清除tmplist,因为它是一个'#'。如果下一个对象不是#但是tmplist大于1我想将tmplist添加到2d ArrayList(由ArrayLists组成的ArrayList)并清除tmplist以便我可以找到其他部分。

这是我的问题:如果我这样做,那么2d arraylist不包含templists的deepcopys - > 2d arraylist由空列表组成,因为我在每个找到的“模式”之后清除了tmplist。我该如何解决这个问题?

一些可能更好地解释它的代码:

List<Object> tmplist = new ArrayList<Object>();
   for (int i = 0; i<array.length(); i++) {
       if (array[i].equals(#)) {
          tmplist.add(array[i]);
              if (!array[i+1].equals(#) && tmplist.size() < 2){
                  tmplist.clear();
              } else if (!array[i+1].equals(#) && tmplist.size() > 1) {
                   pattern.add(tmplist);
                   tmplist.clear();
              } 
       }
   }
   //pattern is the 2d ArrayList (ArrayList which consists of ArrayLists)

5 个答案:

答案 0 :(得分:2)

而不是tmplist.clear()执行tmplist = new ArrayList<>(),而是每次都使用不同的List实例。

答案 1 :(得分:2)

如果你的2d ArrayList是:result

 result.add(new ArrayList<>(tmpList));

通过执行此操作,您不会添加tmpList本身,而是添加值为tmpList的新列表。因此,即使您执行tmpList.clear(),也不会影响result中的arraylist。

答案 2 :(得分:1)

我认为最简单的解决方案是不清除列表,而是在将其添加到列表列表后,将其分配给对ArrayList的新引用。

答案 3 :(得分:1)

好的..我知道你现在必须使用建议对它进行排序....但我只是想我会让程序做到这一点......这是我的解决方案的样子,而不是最好的方法或许这样做,但应该有效......

import java.util.ArrayList;


import javax.swing.text.rtf.RTFEditorKit;

public class ArrTest {
public static void main(String[] args) {
    String[] text = new String[] { "a","#","#","b", "c", "#", "#","#", "b", "3", "3" };
    Map<Integer, List<String>> retMap = new HashMap<Integer, List<String>>();
    List<String> repeatString;
    int count = 0;
    for (int i = 1; i < text.length; i++) {
        if(text[i].equals(text[i-1])){
            repeatString = new ArrayList<String>();
            repeatString.add(text[i]);
            for(int j=i;j<text.length;j++){
                if(text[j].equals(text[i])){
                    repeatString.add(text[j]);
                } else {
                    break;
                }
            }
            retMap.put(count, repeatString);
            count++;
            i++;
        }
    }

    Iterator<Integer>iter = retMap.keySet().iterator();
    while(iter.hasNext()){
        System.out.println(retMap.get(iter.next()));
    }
}
}

希望有所帮助:)

输出:

[#,#]
[#,#,#]
[3,3]

答案 4 :(得分:1)

您的代码,根据@heenenee的回答修改:

List<Object> tmplist = new ArrayList<Object>();
for (int i = 0; i<array.length(); i++) {
    if (array[i].equals(#)) {
        tmplist.add(array[i]);
        if (!array[i+1].equals(#) && tmplist.size() < 2) {
            tmplist.clear();
        } else if (!array[i+1].equals(#) && tmplist.size() > 1) {
            pattern.add(tmplist);
            tmplist = new ArrayList<Object>(); // Easy changes here
        }
    }
}
//pattern is the 2d ArrayList (ArrayList which consists of ArrayLists)