简体   繁体   中英

How to print array list in required format?

I am using arraylist in java. I have written following code:

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);  
    }
}

And this Java function gives result as:

[[root, cisco123,12345,2345, root234, cccccc],[root, cisco123,12345,2345, root234, cccccc]]

but I want result like:

[[root, cisco123,12345,2345], [root234, cccccc]]

I think I am missing declaration/initialization trick somewhere.

How do I get this result?

尝试将mylist的初始化移动到for循环中。

try this :

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]]

What has happened here is regardless of which iteration of for loop is being executed, elements are added to the same list mylist . At the end of each iteration, 'mylist' is added to the finalresult . That is, in this case, two copies of same list is added to finalresult .

To overcome this, you have to create new list at the beginning of each iteration of the for loop, and add elements to that list. At the end of each iteration, add the newly created list to 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
        }
      }

    }

You can use regular expressions like this:

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));
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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