迭代数组列表并在值不同时创建新的ArrayLists,这是否可能?

时间:2013-06-11 20:14:53

标签: java arrays sorting arraylist

我对Java很新,我偶然发现了一个我无法理解的问题。首先让我解释一下我要做的事情,然后我将向您展示我到目前为止的代码。

我有一个webservice,它返回一个数组数组(包括公司和业务字符串行)。我希望将其转换为字符串列表,我在下面的第一行代码中做了。然后我希望遍历列表并且每次遇到公司的不同价值时,我想创建一个新的ArrayList并将相关的业务线添加到新列表中。 webservice的示例输出:80,80,64,64(这是预先设定的,因此相同的公司将始终组合在一起)相关的lobs将分别为1,2,3,4。我想要的是:arraylist [0]:1,2 arrayList [1]:3,4

到目前为止我所拥有的:

    List coList = Arrays.asList(coArray);
    //create list of lists
    List<List<String>> listOfLists = new ArrayList<List<String>>();
    String cmp = "";
    for (int i=0;i<coList.size();i++){//loop over coList and find diff in companies
        String currentCo = ((__LOBList)coList.get(i)).getCompany();
        String currentLob = ((__LOBList)coList.get(i)).getLobNum();
        if(i<coArray.length-1){
            String nextCo = ((__LOBList)coList.get(i+1)).getCompany();
            if((currentCo.equals(nextCo))){
                //do nothing companies are equal
            }else{
                log("NOT EQUAL"); //insert logic to create a new array??
                ArrayList<String> newList = new ArrayList<String>();
        //      for(int j=0;j<coList.size();j++){
                newList.add( ((__LOBList)coList.get(i)).getLobNum());                   
        //      }   


                for(int k=0; k<listOfLists.size();k++){//loop over all lists
                    for(int l=0;l<listOfLists.get(k).size();l++){ //get first list and loop through

                    }
                    listOfLists.add(newList);   
                }

            }
        }


    }

我的问题是它没有将元素添加到新的字符串数组中。它确实循环通过coList,我把一个日志放在公司不相等的位置,所以我知道我需要在哪里创建一个新的arrayList,但我无法让它在我的生活中工作,请帮忙!

6 个答案:

答案 0 :(得分:1)

听起来我觉得更好的选择是列表地图。让公司ID成为Map中的关键,并将该公司ID的每个新项目附加到值为List的列表中。

使用正确的工具完成工作。数组太低了。

答案 1 :(得分:1)

创建Map<String, List<Bussiness>>

每次检索公司名称时,首先检查密钥是否已在地图中。如果是,请检索列表并将Bussiness对象添加到其中。如果不是,请在空List时插入新值并插入要评估的值。

答案 2 :(得分:1)

是的,你可以这样做,但用Java编写真的很烦人。注意:这在Clojure或Haskell等函数式编程语言中很简单。它只是一个名为group-by的函数。在java中,这是我如何做到这一点:

  1. 初始化列表列表。
  2. 创建一个作为List的last指针。这包含您添加到的最后一个列表。
  3. 只要“没有改变”,就迭代原始数据并填充到最后一个。如果某些内容发生了变化,请创建一个新的last
  4. 我会告诉你如何:

    package com.sandbox;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class Sandbox {
    
        public static void main(String[] args) {
            ArrayList<String> rawInput = new ArrayList<String>();
            rawInput.add("80");
            rawInput.add("80");
            rawInput.add("60");
            rawInput.add("60");
            new Sandbox().groupBy(rawInput);
        }
    
        public void groupBy(List<String> rawInput) {
            List<List<String>> output = new ArrayList<>();
            List<String> last = null;
    
            for (String field : rawInput) {
                if (last == null || !last.get(0).equals(field)) {
                    last = new ArrayList<String>();
                    last.add(field);
                    output.add(last);
                } else {
                    last.add(field);
                }
            }
    
            for (List<String> strings : output) {
                System.out.println(strings);
            }
        }
    }
    

    输出:

    [80, 80]
    [60, 60]
    

    当然,您可以执行其他人建议的操作,但这会更改您的数据类型。他们建议“适合工作的工具”,但他们没有提到番石榴Multimap。如果您决定将数据类型更改为地图,这将使您的生活更轻松。

    以下是如何使用它的示例from this article

    public class MutliMapTest {
        public static void main(String... args) {
      Multimap<String, String> myMultimap = ArrayListMultimap.create();
    
      // Adding some key/value
      myMultimap.put("Fruits", "Bannana");
      myMultimap.put("Fruits", "Apple");
      myMultimap.put("Fruits", "Pear");
      myMultimap.put("Vegetables", "Carrot");
    
      // Getting the size
      int size = myMultimap.size();
      System.out.println(size);  // 4
    
      // Getting values
      Collection<string> fruits = myMultimap.get("Fruits");
      System.out.println(fruits); // [Bannana, Apple, Pear]
    
      Collection<string> vegetables = myMultimap.get("Vegetables");
      System.out.println(vegetables); // [Carrot]
    
      // Iterating over entire Mutlimap
      for(String value : myMultimap.values()) {
       System.out.println(value);
      }
    
      // Removing a single value
      myMultimap.remove("Fruits","Pear");
      System.out.println(myMultimap.get("Fruits")); // [Bannana, Pear]
    
      // Remove all values for a key
      myMultimap.removeAll("Fruits");
      System.out.println(myMultimap.get("Fruits")); // [] (Empty Collection!)
     }
    }
    

答案 3 :(得分:0)

尝试使用foreach而不是

就像

一样

foreach(列出listOfLists中的firstGroup)            foreach(firstGroup中的字符串)               ............

答案 4 :(得分:0)

感谢大家的投入! 我最终得到了一份清单:

import java.util。*;

import search.LOBList; public class arraySearch {

/**
 * @param args
 */
public static void main(String[] args) {
    LOBList test = new LOBList();
    test.setCompany("80");
    test.setLOB("106");

    LOBList test1 = new LOBList();
    test1.setCompany("80");
    test1.setLOB("601");

    LOBList test2 = new LOBList();
    test2.setCompany("80");
    test2.setLOB("602");

    LOBList test3 = new LOBList();
    test3.setCompany("90");
    test3.setLOB("102");

    LOBList test4 = new LOBList();
    test4.setCompany("90");
    test4.setLOB("102");

    LOBList test5 = new LOBList();
    test5.setCompany("100");
    test5.setLOB("102");

    LOBList BREAK = new LOBList();
    BREAK.setCompany("BREAK");
    BREAK.setLOB("BREAK");
    BREAK.setcompany_lob("BREAK");

     // create arraylist       
      ArrayList<LOBList> arlst=new ArrayList<LOBList>();
      // populate the list
      arlst.add(0,test);
      arlst.add(1,test1);
      arlst.add(2,test2);
      arlst.add(3,test3);
      arlst.add(4,test4);
      arlst.add(5,test5);

         //declare variables
         int idx = 0;
         String nextVal = "";
         //loops through list returned from service, inserts 'BREAK' between different groups of companies
         for(idx=0;idx<arlst.size();idx++){
              String current = arlst.get(idx).getCompany();          
                if(idx != arlst.size()-1){
                    String next = arlst.get(idx+1).getCompany();
                    nextVal = next;
                    if(!(current.equals(next))){
                          arlst.add(idx+1,BREAK);   
                          idx++; 
                      }                                       
                }                   
          }
        //add last break at end of arrayList 
          arlst.add(arlst.size(),BREAK);  
          for(int i=0;i<arlst.size();i++){
              System.out.println("co:" + arlst.get(i).getCompany());
          }
          //master array list
          ArrayList<ArrayList<LOBList>> mymasterList=new ArrayList<ArrayList<LOBList>>();
          mymasterList = searchListCreateNewLists(arlst);
          //print log, prints all elements in all arrays
          for(int i=0;i<mymasterList.size();i++){
              for(int j=0;j<mymasterList.get(i).size();j++){
                  System.out.println("search method: " + mymasterList.get(i).get(j).getCompany());                   
              }
              System.out.println("end of current list");
          }   
}   
//method to loop over company array, finds break, creates new array list for each company group, 
//adds this to a list of lists(masterList) 
public static ArrayList<ArrayList<LOBList>> searchListCreateNewLists(ArrayList<LOBList> list){      
      ArrayList<ArrayList<LOBList>> masterList=new ArrayList<ArrayList<LOBList>>();
      int end = 0;
      int start = 0;
      int index = 0;
      for(int i=0;i<list.size();i++){
          if(list.get(i).getCompany().equals("BREAK")){
              end = i;//end is current index
              masterList.add(new ArrayList<LOBList>());
              for(int j = start;j<end;j++){
                   masterList.get(index).add(list.get(j));
              }
              index++;
              start = i+1;
          }

      }

    return masterList;
}

}

输出是: 搜索方法:80 搜索方法:80 搜索方法:80 当前列表的结尾 搜索方法:90 搜索方法:90 当前列表的结尾 搜索方法:100 当前列表的结尾

因此,公司:80的所有公司LOBList对象都被列在一个列表中,90和100也是如此。

答案 5 :(得分:0)

要遍历列表,您可以使用

  ListIterator litr = coList.listIterator();
  while(litr.hasNext()){



  }