2016-08-18 93 views
0

here is a big list ,I want to separate this list into two lists according to "A7750" and "A7741" 我也嘗試寫代碼來實現它,但它未能如何將列表分成兩個列表?

public class Test { 
    public static void main(String[] args) { 
    ArrayList<String> list=new ArrayList<String>(); 
    ArrayList<String> list1=new ArrayList<String>(); 
    list.add("A7750 0.0 28.30"); 
    list.add("A7750 0.3 28.30"); 
    list.add("A7741 0.0 31.40"); 
    list.add("A7741 0.1 31.40"); 
    Boolean tag=true; 
    for(int i=0;i<list.size();i++){ 
     if(i>=1){ 
     String str[]=list.get(i).split("\t"); 
     String str1[]=list.get(i-1).split("\t"); 
     if(tag){ 
      list1.add(list.get(i-1)); 
      if(!str[0].equals(str1[0])){ 
       for(String t:list1){ 
        System.out.println(t); 
       } 
       list1.clear(); 
       System.out.println("..."); 
      } 
      } 
     } 

     } 



    } 
} 
+4

你是怎麼失敗的? – ChiefTwoPencils

+0

作爲旁註,這看起來應該是一個'List '而不是'List ' – SomeJavaGuy

+0

我只能得到一個列表而不是兩個列表,你有更好的方法來做到這一點嗎? – Ming

回答

0

這裏的格式是一個測試類,它應該做你想要什麼:

public class Test { 
    public static void main(String[] args) { 
     List<String> list = new ArrayList<>(); 
     Map<String, List<String>> tagMap = new HashMap<>(); 
     // Populate the list 
     list.add("A7750 0.0 28.30"); 
     list.add("A7750 0.3 28.30"); 
     list.add("A7741 0.0 31.40"); 
     list.add("A7741 0.1 31.40"); 
     list.add("A7752 0.5 31.40"); 
     list.add("A7752 0.7 31.40"); 

     // Loop through all the entries 
     for (String entry : list) { 
      // Split on space to get the tag 
      String tag = entry.split(" ")[0]; 
      // Get the list of data starting with this tag 
      List<String> tagList = tagMap.get(tag); 
      if (tagList == null) { 
       // If there are no other entries for tag yet, add a 
       // new list to the map 
       tagList = new ArrayList<>(); 
       tagMap.put(tag, tagList); 
      } 
      // Add the current entry to the list 
      tagList.add(entry); 
     } 

     // Print out the results 
     for (Map.Entry<String, List<String>> entry : tagMap.entrySet()) { 
      System.out.println(entry.getKey() + ": " + entry.getValue()); 
     } 
    } 
} 

在它的結束,tagMap將包含映射從每個標籤到該標籤開始的條目列表。爲了獲得給定標籤的條目列表(例如A7750),請執行以下操作:tagMap.get("A7750");

+0

謝謝,它解決我的問題! – Ming

+0

@Ming沒問題,很高興提供幫助!請點擊綠色的對號和向上箭頭,表示我的回答解決你的問題。 – mapeters

1

可以使用String.startsWith查看在您的列表中的每個字符串,你想要什麼,並開始添加相應的新名單。

for(String element: bigList){ 
    if(element.startsWith("A7750")){ 
     list1.add(element); 
    } 
    else if(element.startsWith("A7741")){ 
     list2.add(element); 
    } 
} 

編輯

如果你有幾千行,你可以使用一個Map存儲列表如下。

Map<String,List<String>> map=new HashMap<>(); 
for(String element: bigList){ 
    // Split each element by space. 
    String parts=element.split(" "); 

    // if the map contains your key ex: "A7741", add the string to the corresponding list. 
    if(map.containsKey(parts[0])){ 
     List<String> list = map.get(parts[0]); 
     list.add(element); 
    }else{ 
     // create a new list and add it to the map with a new key. 
     List<String> list = new ArrayList<>(); 
     list.add(element); 
     map.put(parts[0],list); 
    } 
} 

在結束時,將地圖將具有一組列表,其中每個條目的key是從它的元素從凝視的字符串。

我假設你的字符串總是有類似A7750 0.0 28.30

+0

謝謝你的代碼。但我不想像「A7750」那樣絕對地定義它,你知道1行中的第一個字符串和2行中的第一個字符串是相同的。我想把它作爲我的條件,而不是「 A7750「 – Ming

+0

對不起,我沒有得到你。你可以說得更詳細點嗎?你是什​​麼意思'「你知道第一個字符串中1行和2行中的第一個字符串是same.I希望把這個作爲我的條件,而不是‘A7750’' –

+0

如果我的biglist有超過4點的數據和有1000個數據,如果我使用的方法一樣,你寫「A7750」,「A7741」,我必須寫500串這樣的。這是一個艱苦的工作,你可以提高你的代碼? – Ming

0

我發現了一些可以更正的內容。

  1. 拆分必須發生在空格字符(「」)而不是「\ t」字符上。
  2. 將第一個元素直接添加到另一個列表並對後續元素應用檢查。

此外,我添加了一個新的列表,以保持簡單。

您可以使用此:

public static void main(String[] args) { 
     ArrayList<String> list = new ArrayList<String>(); 
     ArrayList<String> list1 = new ArrayList<String>(); 
     ArrayList<String> list2 = new ArrayList<String>(); 
     list.add("A7750 0.0 28.30"); 
     list.add("A7750 0.3 28.30"); 
     list.add("A7741 0.0 31.40"); 
     list.add("A7741 0.1 31.40"); 
     String str[] = list.get(0).split(" "); 
     list1.add(list.get(0)); 
     for (int i = 1; i < list.size(); i++) { 
      String str1[] = list.get(i).split(" "); 
      boolean tag = str[0].equals(str1[0]); 
      if (tag) { 
       list1.add(list.get(i)); 
      } else { 
       list2.add(list.get(i)); 
      } 
     } 
     System.out.println(list1); 
     System.out.println(list2); 
    } 

希望這有助於!

+0

如果我有100個數據,而不是僅僅4行data.How實現它? – Ming

+0

比如我有這樣的「A7750 \t 0.0 \t 28.30」的biglist「A7750 \t 0.0 \t 28.30」 「A7751 \t 0.0 \t 28.30」 「A7751 \t 0.0 \t 28.30」 「A7752 \t 0.0 \t 28.30」 「A7752 \t 0.0 \t 28.30」 「A7752 \t 0.0 \t 28.30」 「 A7752 \t 0.0 \t 28.30" – Ming

+0

這仍然工作提供了你剛纔有兩個標籤,如A7750和A7741。 – anacron

0

您必須使用Map來保存標籤和他們的列表。通過這樣做,您可以根據標籤輕鬆找到列表。這應該適合你:

ArrayList<String> list = new ArrayList<>(); 

list.add("A7750 0.0 28.30"); 
list.add("A7741 0.0 31.40"); 
list.add("A7760 0.1 31.40"); 
list.add("A7741 0.1 31.40"); 
list.add("A7750 0.3 28.30"); 
list.add("A7750 0.6 28.36"); 
// add if you want more ... 

// Create map for different tags and their list 
Map<String, List<String>> mapOfTagAndList = new HashMap<>();  

// Enter the tags and their list into the map   
for (int i = 0; i < list.size(); i++) { 
    String s = list.get(i); 
    String tag = s.split(" ")[0]; 
    List<String> listWithTag = new ArrayList<>(); 

    if(!mapOfTagAndList.containsKey(tag)) { 
     listWithTag.add(s); 
     mapOfTagAndList.put(tag, listWithTag); 
    } 
    else {     
     listWithTag = mapOfTagAndList.get(tag); 
     listWithTag.add(s); 
     mapOfTagAndList.put(tag, listWithTag); 
    } 
}   

// Print the tags and their lists  
for (Map.Entry<String, List<String>> entry : mapOfTagAndList.entrySet()) { 
    String tag = entry.getKey(); 
    System.out.println("tag = "+tag); 

    List<String> tagList = entry.getValue();   
    System.out.println("list for the tag = "+tagList);    
} 
+0

謝謝你的回答。它解決了我的問題 – Ming