2016-08-18 58 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