我遍历一个由对象组成的数组。我想找到这个数组的某些部分,其中相同的特定对象相互跟随。
[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)
答案 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)