2017-03-16 84 views
0

的收藏我想排序基於前兩列值的文件內容:分類收集

我的文件內容爲:

文件名:ComplexMapFileReader.txt

而且conetent是:

B 12 hgjhgjgjgjgjgjhgjgjgjgjgjgj 
B 3 jgjdSAGdjgsdKJADJgjfgAJFL 
B 6 jygtjgjgjgjgjgjhgjhbj 
C 7 uiyuiyikykk 
C 2 wrteyytyuiiiiyjhg 
A 1 hikhkhkhkjhkhkhjkhkh 
A 4 khkhkkhkhkhkhkh 
A 2 khkhkhkhkhkhkhkhkhkhkhkhh 
A 11 jhgjsGJDGjAGFjgfjgjfgj 
A 5 gjgjgsadgajgjDGkkhkhdDKjhkjd 
B 5 hdskdhkljdhKAJHDKjahsd 
A 12 kjhkdjhfknkjflkjfsdlkjf 
C 3 kjhfekJEHFKHefkh 
B 34 khkhkjhkjhkqlwwjljlllljj 
A 21 iuhEWHRIekhrlkHRKErhwkrhk;h;kfnk.nfas 
C 11 jlklkqwwlklklklllklkkkkjjj   

我對相同的代碼是:

package CollectionExamples; 

import java.io.BufferedReader; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.HashMap; 
import java.util.Map; 
import java.util.Map.Entry; 
import java.util.TreeMap; 

public class MapFileReader { 

    private static final String FILENAME = "D:\\ComplexMapFileReader.txt"; 

    public static void main(String[] args) { 

     BufferedReader br = null; 
     FileReader fr = null; 

     Map<Integer, String> innerMap = null; 
     Map<String, TreeMap> outerMap = new TreeMap(); 
     try { 
      fr = new FileReader(FILENAME); 
      br = new BufferedReader(fr); 
      String sCurrentLine; 
      br = new BufferedReader(new FileReader(FILENAME)); 

      try { 
       while ((sCurrentLine = br.readLine()) != null) { 

        String[] s = sCurrentLine.split(" "); 

        if (!outerMap.containsKey(s[0])) { 
         innerMap = new TreeMap(); 
         innerMap.put(Integer.valueOf(s[1]), s[2]); 
         outerMap.put(s[0], (TreeMap) innerMap); 
        } else { 
         innerMap.put(Integer.valueOf(s[1]), s[2]); 
         outerMap.put(s[0], (TreeMap) innerMap); 
        } 

       } 

       String s0 = null; 
       String s1 = null; 
       String s2 = null; 

       for (Entry<String, TreeMap> map1 : outerMap.entrySet()) { 

        s0 = map1.getKey(); 

        for (Entry<Integer, String> map2 : innerMap.entrySet()) { 

         s1 = " "+map2.getKey() + ""; 
         s2 =" "+ map2.getValue(); 
         System.out.println("Each line equals:" + s0 + s1 + s2); 
         System.out.println("#############"); 

        } 

       } 

      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

} 

上面的代碼沒有給我想要的結果。但有序當上述文件是在某種形式的像(字母表中的所有B的一起或A的一起),那麼文件內容如下所示給出正確的排序:

B 12 hgjhgjgjgjgjgjhgjgjgjgjgjgj 
B 3 jgjdSAGdjgsdKJADJgjfgAJFL 
B 6 jygtjgjgjgjgjgjhgjhbj 
C 7 uiyuiyikykk 
C 2 wrteyytyuiiiiyjhg 
A 1 hikhkhkhkjhkhkhjkhkh 
A 4 khkhkkhkhkhkhkh 
A 2 khkhkhkhkhkhkhkhkhkhkhkhh 
A 11 jhgjsGJDGjAGFjgfjgjfgj 
A 5 gjgjgsadgajgjDGkkhkhdDKjhkjd 

,結果是所期望的。(在排序字母和然後按號碼):

輸出:

Each line equals:A 1 hikhkhkhkjhkhkhjkhkh 
############# 
Each line equals:A 2 khkhkhkhkhkhkhkhkhkhkhkhh 
############# 
Each line equals:A 4 khkhkkhkhkhkhkh 
############# 
Each line equals:A 5 gjgjgsadgajgjDGkkhkhdDKjhkjd 
############# 
Each line equals:A 11 jhgjsGJDGjAGFjgfjgjfgj 
############# 
Each line equals:B 1 hikhkhkhkjhkhkhjkhkh 
############# 
Each line equals:B 2 khkhkhkhkhkhkhkhkhkhkhkhh 
############# 
Each line equals:B 4 khkhkkhkhkhkhkh 
############# 
Each line equals:B 5 gjgjgsadgajgjDGkkhkhdDKjhkjd 
############# 
Each line equals:B 11 jhgjsGJDGjAGFjgfjgjfgj 
############# 
Each line equals:C 1 hikhkhkhkjhkhkhjkhkh 
############# 
Each line equals:C 2 khkhkhkhkhkhkhkhkhkhkhkhh 
############# 
Each line equals:C 4 khkhkkhkhkhkhkh 
############# 
Each line equals:C 5 gjgjgsadgajgjDGkkhkhdDKjhkjd 
############# 
Each line equals:C 11 jhgjsGJDGjAGFjgfjgjfgj 
############# 

但是當文件具有內容下面的一個,我沒有得到期望的結果。我知道它是地圖,它將覆蓋以下情況下的先前值。但有沒有什麼辦法可以更好地解決這個問題。

B 12 hgjhgjgjgjgjgjhgjgjgjgjgjgj 
    B 3 jgjdSAGdjgsdKJADJgjfgAJFL 
    B 6 jygtjgjgjgjgjgjhgjhbj 
    C 7 uiyuiyikykk 
    C 2 wrteyytyuiiiiyjhg 
    A 1 hikhkhkhkjhkhkhjkhkh 
    A 4 khkhkkhkhkhkhkh 
    A 2 khkhkhkhkhkhkhkhkhkhkhkhh 
    A 11 jhgjsGJDGjAGFjgfjgjfgj 
    A 5 gjgjgsadgajgjDGkkhkhdDKjhkjd 
    B 5 hdskdhkljdhKAJHDKjahsd 
    A 12 kjhkdjhfknkjflkjfsdlkjf 
    C 3 kjhfekJEHFKHefkh 
    B 34 khkhkjhkjhkqlwwjljlllljj 
    A 21 iuhEWHRIekhrlkHRKErhwkrhk;h;kfnk.nfas 
    C 11 jlklkqwwlklklklllklkkkkjjj   
+0

與您的代碼無需更改任何一行代碼都ComplexMapFileReader.txt給了我同樣的結果。所有按預期排序(首先按字母和數字排序) 僅供參考:我使用java 1.8.0_60,我也使用Jetbrain java IDE(IDEA) – ash

+0

最簡單的方法和更安全的方法是從每行創建對象並保存他們在一個集合中。然後將所需的Comparator傳遞給Collection.sort()方法進行排序。 –

回答

-1

我認爲這是一個更好的方式來表示每個記錄對象的行。實際上,我們不需要TreeMap進行排序。如果你想添加更多的字段或者改變比較邏輯,它會更加方便。對於記錄列表,我們只需要實現Comparable接口來實現您的比較邏輯。

例如:

import java.io.BufferedReader; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 

public class MapFileReader { 

    private static final String FILENAME = "D:\\ComplexMapFileReader.txt"; 


    private static class Record { 
     private char ch; 
     private int num; 
     private String string; 

     public void setCh(char ch) { 
      this.ch = ch; 
     } 

     public char getCh() { 
      return ch; 
     } 

     public void setNum(int num) { 
      this.num = num; 
     } 

     public int getNum() { 
      return num; 
     } 

     public String getString() { 
      return string; 
     } 

     public void setString(String string) { 
      this.string = string; 
     } 

    } 

    public static void main(String[] args) { 

     BufferedReader br; 
     try { 
      String sCurrentLine; 
      br = new BufferedReader(new FileReader(FILENAME)); 

      List<Record> records = new ArrayList<>(); 

      try { 
       while ((sCurrentLine = br.readLine()) != null) { 

        String[] s = sCurrentLine.split(" "); 

        if (s.length != 3) { 
         // Filter invalid records 
         continue; 
        } 

        Record r = new Record(); 
        r.ch = s[0].charAt(0); 
        r.num = Integer.parseInt(s[1]); 
        r.string = s[2]; 

        records.add(r); 
       } 

       Collections.sort(records, new Comparator<Record>() { 
        @Override 
        public int compare(Record o1, Record o2) { 
         if (o1.ch == o2.ch) { 
          return o1.num < o2.num ? -1 : (o1.num == o2.num ? 0 : 1); 
         } 
         return o1.ch < o2.ch ? -1 : 1; 
        } 
       }); 

       for (Record record : records) { 
        System.out.println(String.format("Each line equals: %s %s %s", record.ch, record.num, record.string)); 
        System.out.println("#############"); 
       } 

      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

} 
+0

僅有代碼的答案被視爲題外話題。你必須解釋你改變了什麼,以及爲什麼它解決了OP的問題。 –

+0

總是希望將自定義的「比較器」與分類呼叫一起傳遞。所以,我們不限制'Record'對象的排序功能。 –

+0

同意Shyam – vibhas