2014-04-27 80 views
1

我有一個查詢。在我的Java程序中,我有一個字符串列表,但我需要知道如何通過包含在字符串中的整數對它們進行排序。我將如何排序該字符串中的整數字符串列表? * Java *

例如:

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

而且在該列表:

"PersonOne - 1234 seconds"; 
"PersonTwo - 5678 seconds"; 

我需要在每個字符串的數字來排序。 (列表中會有更多的項目)。

+0

如果你碰巧在UNIX,Linux或OS X終端上很舒服,你可能想看看命令「sort -k3 -n」是否符合你的建議。 – minopret

回答

1

既然你有一個列表中的字符串,你可以寫一個自定義比較器來做到這一點。 在比較器中,您需要提取數字。要做到這一點,你可以在-上拆分,然後分割空間。

public static void main(String[] args) { 
    ArrayList<String> list = new ArrayList<String>(); 
    list.add("PersonTwo - 5678 seconds"); 
    list.add("PersonOne - 1234 seconds"); 
    list.add("PersonOnedf - 34 seconds"); 

    System.out.println("Initial : " + list); 
    Collections.sort(list, new Comparator<Object>() { 
      @Override 
      public int compare(Object arg0, Object arg1) { 
       String s1 = (String)arg0; 
       String s2 = (String)arg1; 
       Integer n1 = Integer.parseInt(s1.split("-")[1].trim().split(" ")[0]); 
       Integer n2 = Integer.parseInt(s2.split("-")[1].trim().split(" ")[0]); 
       return (n1 < n2 ? -1 : 1); 
      } 
     }); 

    System.out.println("Sorted : " + list); 

} 


輸出:

Initial : [PersonTwo - 5678 seconds, PersonOne - 1234 seconds, PersonOnedf - 34 seconds] 
    Sorted : [PersonOnedf - 34 seconds, PersonOne - 1234 seconds, PersonTwo - 5678 seconds] 
+0

就像一個快速問題一樣**?**和**:**意味着/做了什麼? – Gokarting54

+1

@ Gokarting54 http://stackoverflow.com/questions/798545/what-is-the-java-operator-called-and-what-does-it-do – axiom

+0

謝謝,我現在可以理解代碼! – Gokarting54

4

首先將這些字符串轉換爲包含名稱(String)和若干秒(int)的結構化對象(例如Score)。然後按秒數排序這些對象。

解析字符串應該很簡單:您只需要找到第一個破折號的索引以及破折號之後的第一個空格的索引。 String javadoc應該可以幫助您找到如何查找字符串中的字符以及如何提取子字符串。

請注意,除非這些字符串來自您必須解析的某個文件或外部資源,否則您不應該首先解析它們。在開始時使用Score對象,並且只有在必須打印它們時纔將它們轉換爲Strings。

+0

啊,但第一個空間就在破折號後面,所以我怎麼得到第二個空間呢? – Gokarting54

+3

爲什麼downvote?這是完全正確的,想寫同樣的...從我+1 +1 – ElDuderino

+2

@ Gokarting54:加1到破折號的索引,然後搜索這個索引後的第一個空格。 –

1

如果你的ArrayList的元素,從這個是相同的格式爲PersonOne - 1234 seconds,你可以把整數作爲,

String str = "PersonOne - 1234 seconds"; 
int integer = Integer.ParseInt(str.split("\\s")[2]); 

採取一切整數這種格式和排序。

+0

所以「\\ s」得到所有字母? – Gokarting54

+0

但是我怎麼會然後整理這些整數列表? – Gokarting54

+0

@ Gokarting54 \\ s將按空格分割字符串(\ n,\ r,\ t,\ f和「」) 通過使用Collection.sort,您可以輕鬆地對列表進行排序 –

3

使用自定義比較:

Collections.sort(list, new Comparator<String>() { 
    public int compare(String a, String b) { 
     return Integer.compare(Integer.parseInt(a.replaceAll("\\D", "")), Integer.parseInt(b.replaceAll("\\D", ""))); 
    } 
}); 

你甚至可以創建一個輔助方法,使代碼更清潔:

Collection.sort(list, new Comparator<String>() { 
    public int compare(String a, String b) { 
     return Integer.compare(parse(a), parse(b)); 
    } 
    int parse(String s) { 
     return Integer.parseInt(s.replaceAll("\\D", "")); 
    } 
}); 
+1

它必須是'Collections.sort()' – Braj

+0

@Braj。 iPhone上的縮略代碼有其挑戰。自Java 8以來,可以使用 – Bohemian

+0

...或list.sort(比較器)。 – Pshemo

0

我認爲你的數組不應該只是一個String的數組。昆蟲學可以創建一個類,其中包含Integer類型Stringtime的兩個變量name。之後,您可以創建您創建的類的一個對象數組。然後你可以按秒排序。

類會有一些怎麼樣以下幾點:(注:編碼不測試

 public class SomeClassName 
    { 
    private String name; 
    private Integer time; 

    // Constructors 

    public SomeClassName() 
    { 
    super(); 
    } 

    public SomeClassName(String name, Integer time) 
    { 
    this.name=name; 
    this.time=time; 
    } 
    // create setter and getter methods 

    public void setName(String name) 
    { 
    this.name=name 
    } 

    public void setTime(Integer time) 
    { 
    this.time=time 
    } 

    public String getName() 
    { 
    return name; 
    } 
    public Integer getTime() 
    { 
    return time; 
    } 


} 

,那麼你可以創建一個類的數組如下:

ArrayList<SomeClassName> list = new ArrayList<SomeClassName>(); 
list.add(new SomeClassName("PersonOne" ,1234)); 
list.add(new SomeClassName("PersonTwo",5678)); 

根據您需要使用自定義壓縮器的某些屬性對對象的ArrayList進行排序。檢查這個鏈接:Sort ArrayList of custom Objects by property