2017-04-13 49 views
0

我嘗試根據三列的值對製表符分隔的文件進行排序。但它沒有正確排序。我可以如何解決這個問題? 我用這個page寫的代碼。如何在java中使用某些列對CSV文件進行排序

輸出是這樣的:

clueweb09-en0000-12-00000 10722 10732 0.995358 0.000336 /m/0cbx95 
    clueweb09-en0000-12-00000 10736 10746 0.950789 0.000697 /m/01n7q 
    clueweb09-en0000-12-00000 11230 11237 0.829546 0.000291 /m/03jm5 
    clueweb09-en0000-12-00000 13009 13024 0.540326 0.000085 /m/012qgt 
    clueweb09-en0000-12-00000 13050 13060 0.950789 0.000697 /m/01n7q 
    clueweb09-en0000-12-00000 1338 1348 0.950789 0.000697 /m/01n7q 
    clueweb09-en0000-12-00000 1864 1874 0.950789 0.000697 /m/01n7q 
    clueweb09-en0000-12-00000 2018 2028 0.950789 0.000697 /m/01n7q 
    clueweb09-en0000-12-00000 2745 2752 0.78671  0.000722 /m/02jx1 
    clueweb09-en0000-12-00000 2823 2829 0.956747 0.000476 /m/04jpl 
    clueweb09-en0000-12-00000 2856 2862 0.649632 0.000007 /m/0gs0g 

我想這樣的輸出:

clueweb09-en0000-12-00000 1338 1348 0.950789 0.000697 /m/01n7q 
    clueweb09-en0000-12-00000 1864 1874 0.950789 0.000697 /m/01n7q 
    clueweb09-en0000-12-00000 2018 2028 0.950789 0.000697 /m/01n7q 
    clueweb09-en0000-12-00000 2745 2752 0.78671  0.000722 /m/02jx1 
    clueweb09-en0000-12-00000 2823 2829 0.956747 0.000476 /m/04jpl 
    clueweb09-en0000-12-00000 2856 2862 0.649632 0.000007 /m/0gs0g 
    clueweb09-en0000-12-00000 10722 10732 0.995358 0.000336 /m/0cbx95 
    clueweb09-en0000-12-00000 10736 10746 0.950789 0.000697 /m/01n7q 
    clueweb09-en0000-12-00000 11230 11237 0.829546 0.000291 /m/03jm5 
    clueweb09-en0000-12-00000 13009 13024 0.540326 0.000085 /m/012qgt 
    clueweb09-en0000-12-00000 13050 13060 0.950789 0.000697 /m/01n7q 
+0

對鏈接問題的回答明確指出,它將列作爲字符串進行比較。您需要遵循問題評論中的建議,並創建一個代表每一行的數據類。 – VGR

回答

0

我通過將此page比較函數更改爲以下代碼來解決此問題。

private static <T> Comparator<List<T>> createComparator(
     final Comparator<? super T> delegate, final int... indices) 
    { 
     return new Comparator<List<T>>() 
     { 
      @Override 
      public int compare(List<T> list0, List<T> list1) 
      { 

        T element0 = list0.get(indices[0]); 
        T element1 = list1.get(indices[0]); 
        int n = delegate.compare(element0, element1); 
        if (n != 0) 
        { 
         return n; 
        } 
        else 
         return Integer.compare(Integer.parseInt(list0.get(indices[1]).toString()), Integer.parseInt(list1.get(indices[1]).toString())); 
      } 
     }; 
    } 
1

的數字是在這一刻爲字符串處理,但他們是左對齊和排序的方式。 您需要更改比較函數以處理此問題,或者當您讀取文件時,將這些數字轉換爲右對齊的字符串。

+0

你能否解釋一下我應該如何改變比較功能?你的意思是我需要兩個比較函數一個字符串和一個整數? – user3092781

+1

檢查它在這裏..我相信它可以幫助..http://stackoverflow.com/questions/369512/how-to-compare-objects-by-multiple-fields –

+0

下面的代碼引用,當CSV文件是讀取時,每個元素都以字符串形式讀取,比較函數假定您有一組可比較的對象。正確的方法不會將數據加載到字符串列表中,而是創建一個對象並正確解析從文件中獲得的數據。然後創建一個像Porkko例子那樣的比較器。 –

1

爲您想要排序的列編寫自己的比較器。正如Walter所說的,當前您將以字符串形式獲取數據,將其轉換爲對象列表並使用比較器進行排序。 希望這有助於。

+0

我知道問題是比較字符串而不是整數。但我不知道把比較器寫入handell整數和字符串。我的意思是我怎樣纔能有兩個比較器。你能寫一些代碼嗎? – user3092781

相關問題