簡體   English   中英

JAVA使用對象填充臨時Arraylist,然后將其添加到由arrayLists組成的ArrayList中

[英]JAVA fill a temporary Arraylist with objects and then add it into a ArrayList which consists of arrayLists

我遍歷一個由對象組成的數組。 我想找到此數組的某些部分,其中相同的特定對象彼此跟隨。

[a,b,c,#,#,#,h,g,a,#,#,s,#。h]->我要查找#,#,#和#,#(#是特定的賓語)

我已經弄清楚了如何執行此操作:如果找到一個“#”,則將該對象添加到臨時ArrayList中。 如果下一個對象也是“#”,我也將其添加,否則我將清除tmplist,因為它是單個“#”。 如果下一個對象不是#,但是tmplist大於1,我想將tmplist添加到2d ArrayList(由ArrayList組成的ArrayList)中,並清除tmplist,以便我可以找到其他部分。

這是我的問題:如果執行此操作,則2d arraylist不會包含臨時列表的深拷貝-> 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)

如果您的2d ArrayList為: result

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

這樣,您將不會添加tmpList本身,而是添加一個具有tmpList值的新列表。 因此,即使您執行tmpList.clear() ,也不會影響result的arraylist。

不是執行tmplist.clear()而是執行tmplist = new ArrayList<>()因此您每次都使用不同的List實例。

我認為最簡單的解決方案是不清除列表,而是在將其添加到列表列表之后,將新的ArrayList引用分配給tmplist。

好吧..我知道您現在必須已經使用建議進行了整理。...但是我只是想我要編寫程序來執行此操作……這就是我的解決方案的樣子,而不是最好的解決方法,但應該可以...

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]

您的代碼根據@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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM