[英]How to print array list in required format?
我在Java中使用arraylist。 我写了以下代码:
public void myfunction() {
cmdMessage="str1 : root;str2 : cisco123,12345,2345;str1 : root234;str2 : cccccc";
String[] splitMessage = cmdMessage.split(";");
System.out.println("string length is \n" + splitMessage.length);
ArrayList<String> mylist = new ArrayList<>();
ArrayList<ArrayList> finalresult = new ArrayList<>();
for (int i= 0; i<= splitMessage.length-1;i++){
if(splitMessage[i]!=null){
if (splitMessage[i].contains("str1")){
System.out.println("splitted string is "+ (splitMessage[i]).split(":")[1].trim());
mylist.add(((splitMessage[i]).split(":")[1]).trim());
}
if (splitMessage[i].contains("str2")){
System.out.println("str2 length is ..." + splitMessage[i].length());
System.out.println("splitted str2 string is "+ (splitMessage[i]).split(":")[1].trim());
mylist.add(((splitMessage[i]).split(":")[1]).trim());
}
}
finalresult.add(mylist);
}
}
并且此Java函数给出的结果为:
[[root, cisco123,12345,2345, root234, cccccc],[root, cisco123,12345,2345, root234, cccccc]]
但我想要这样的结果:
[[root, cisco123,12345,2345], [root234, cccccc]]
我想我在某处缺少declaration/initialization
技巧。
我如何得到这个结果?
尝试将mylist
的初始化移动到for循环中。
尝试这个 :
public static void main(String... args) {
String cmdMessage="str1 : root;str2 : cisco123,12345,2345;str1 :
root234;str2 : cccccc";
List myList = new ArrayList();
String[] str = cmdMessage.split(";");
List<List> finalList= new ArrayList();
for(String s: str)
{
if(s.contains("str1"))
{ String[] newStr=s.split(":");
myList.add( newStr[1].trim());
}
if(s.contains("str2"))
{ String[] newStr=s.split(":");
myList.add( newStr[1].trim());
finalList.add(myList);
myList=new ArrayList();
}
}
Iterator it = finalList.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
}
OP:
[root, cisco123,12345,2345]
[root234, cccccc]
finalList : [[root, cisco123,12345,2345], [root234, cccccc]]
无论发生了哪个for循环迭代,这里发生的事情都是将元素添加到同一列表mylist
。 在每次迭代结束时,将“ mylist”添加到finalresult
。 也就是说,在这种情况下, finalresult
相同列表的两个副本添加到finalresult
。
为了克服这个问题,您必须在for循环的每次迭代开始时创建一个新列表,并将元素添加到该列表中。 在每次迭代结束时,将新创建的列表添加到finalresult
。
for (int i= 0; i<= splitMessage.length-1;i++){
ArrayList<String> mylist = new ArrayList<>();
// do something with strings...
// ...
finalresult.add(mylist);
}
for (int i= 0; i<= splitMessage.length-1;i++){
if(splitMessage[i]!=null){
if (splitMessage[i].contains("str1")){
System.out.println("splitted string is "+ (splitMessage[i]).split(":")[1].trim());
mylist.add(((splitMessage[i]).split(":")[1]).trim());
}
if (splitMessage[i].contains("str2")){
System.out.println("str2 length is ..." + splitMessage[i].length());
System.out.println("splitted str2 string is "+ (splitMessage[i]).split(":")[1].trim());
mylist.add(((splitMessage[i]).split(":")[1]).trim());
finalresult.add(mylist); // adding after str2
mylist = new ArrayList<>();// creating new list after str
}
}
}
您可以使用如下正则表达式:
public static void myfunction() {
ArrayList<String> mylist;
ArrayList<ArrayList> finalresult = new ArrayList<>();
String cmdMessage = "str1 : root; str2 : cisco123,12345,2345; str1 : root234; str2 : cccccc";
String trimmedMessage = cmdMessage.replaceAll(" ", "");
String[] splitMessage = trimmedMessage.split("str[0-9]:");
for(int i =0;i<splitMessage.length;i++){
if(splitMessage[i].length()>0 && splitMessage[i].contains("root")){
System.out.println("splitted string is " +splitMessage[i] + " " +splitMessage[i+1]);
mylist = new ArrayList<>();
mylist.add(splitMessage[i].replaceAll("[;,:]",""));
mylist.add(splitMessage[i+1].replaceAll("[;:]",""));
i +=1;
System.out.println("Adding list "+Arrays.asList(mylist));
finalresult.add(mylist);
}
}
System.out.println(Arrays.asList(finalresult));
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.