2017-03-20 88 views
-4

我有一個.txt文件的人名和他們在遊戲中獲得的分數,例如。Java:按字符串中包含的數字對字符串列表進行排序(降序)

2 John 
6 Matt 
etc. 

我試圖按照誰的分數最高(他們的名字旁邊的數字)來組織他們。我可以使用子字符串來獲取整數,然後Collections.sort,但我不知道如何將它與名稱聯繫起來。

如果有人有任何聰明的想法,請幫助!我現在有這麼所有的分數/名字被讀入一個ArrayList,如:{2 John, 3 Matt}

+0

你可以實現一個類'PlayerScore'說「包含」兩者的得分和球員的名字,並把該類的實例爲你的'ArrayList'。但是,在排序自定義類時,您可能會遇到另一個問題,但可以隨時提出另一個問題。 – Izruo

+0

我知道這可能是一種矯枉過正,但我​​會將每個名稱表示爲一個對象,即「2 john」將是一個人物對象,其中包含一個用於保存其名稱的數字和字符串名稱的int對象。 C#結構本來是最適合這個的,但由於Java沒有結構,所以在如此小的數據上實現它顯然是一種矯枉過正,但它可行。那麼您可以將所有對象插入到您的ArrayList中,並對最高得分者進行線性搜索並將該人對象存儲到另一個列表中,但不要忘記從包含無序數據的數組列表中刪除最高得分者。 –

+0

你可以發佈你試過的代碼嗎? –

回答

0

你可以簡單地實現對第一空間的自定義Comparator<String>和分裂(限制分割到2)。我還假定關係應該按照詞彙順序排列(按字母順序排列)。像,

List<String> al = new ArrayList<>(Arrays.asList("2 John", // 
     "3 Matt", "3 Adam Smith")); 
al.sort(new Comparator<String>() { 
    @Override 
    public int compare(String o1, String o2) { 
     String[] a = o1.split("\\s+", 2); // <-- split on white space, limit 2. 
     String[] b = o2.split("\\s+", 2); 
     int r = Integer.compare(Integer.parseInt(a[0]), // 
       Integer.parseInt(b[0])); 
     if (r != 0) { 
      return -r; 
     } 
     return a[1].compareTo(b[1]); 
    } 
}); 
System.out.println(al); 

其輸出(如我想你想)

[3 Adam Smith, 3 Matt, 2 John] 
+0

今天下午晚些時候會試試這個,看起來很有前途的謝謝! –

相關問題