2014-12-06 22 views
2

我輸入了多個字符串,我分析每個字符串以提取某些數據,然後相應地顯示它們。關鍵是我需要在顯示它們之前按照一些參數對它們進行排序。 澄清:根據Java中的多個參數遞減排序

String s1 = "a1 5 2014-12-05"; 
String s2 = "a2 10 2014-12-06"; 
String s3 = "a3 5 2014-12-04": 

pasring每個串後,我需要將它們排序遞減首先根據所述第二參數,然後根據日期每當我達到例如領帶。

輸出應該是:

a2, a1, a3 

不知道如何才能實現這一目標,或者如果我能的方式更改爲更高效的一個?

+1

分割字符串,並比較根據規則。 – mic4ael 2014-12-06 23:18:02

+0

@ mic4ael你能澄清更多?! – omarsafwany 2014-12-06 23:20:08

+0

創建一個'Object'(是的,這就是'OO'中第一個'O'代表),它包含三個字段:一個String,一個int和一個LocalDate。然後'實現Comparable ',你可以使用任意數量的方法來對'MyObject'的'Collection'進行排序。 – 2014-12-06 23:20:22

回答

2

您可以解析數據並使用Collections#sort。你的類可以定義使用Comparable和情況下,如果要排序,然後按降序一些自然排序只是通過Comparator.reverseOrder()作爲第二對Arg的Collections#sort這樣

import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.Date; 
import java.util.List; 

public class DateSorter { 

    static class Entry implements Comparable<Entry> { 
     String id; 
     int num; 
     Date date; 
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 

     public Entry(String id, int num, String date) throws ParseException { 
      this.id = id; 
      this.num = num; 
      this.date = sdf.parse(date); 
     } 

     @Override 
     public int compareTo(Entry o) { 
      return date.compareTo(o.date); 
     } 

     @Override 
     public String toString() { 
      return id + '\''; 
     } 
    } 

    public static void main(String[] args) throws ParseException { 
     String s1 = "a1 5 2014-12-05"; 
     String s2 = "a2 10 2014-12-06"; 
     String s3 = "a3 5 2014-12-04"; 

     String[] split = s1.split(" "); 

     List<Entry> entries = new ArrayList<>(); 
     entries.add(new Entry(split[0], Integer.parseInt(split[1]), split[2])); 
     split = s2.split(" "); 
     entries.add(new Entry(split[0], Integer.parseInt(split[1]), split[2])); 
     split = s3.split(" "); 
     entries.add(new Entry(split[0], Integer.parseInt(split[1]), split[2])); 

    Collections.sort(entries, new Comparator<Entry>() { 
     @Override 
     public int compare(Entry o1, Entry o2) { 
      return o2.compareTo(o1); 
     } 
    }); 

     System.out.println(entries); 
    } 
} 

輸出

[a2', a1', a3'] 
+0

差不多有:_I需要先根據第二個參數先降序排列,然後再根據日期排序。您需要通過'id'然後通過'num'和最後通過'date'進行排序。 – 2014-12-06 23:32:48

+0

OP是否想要對數據進行兩次排序?我的意思是我們需要添加\t \t Collections.sort(條目,新的比較(){ \t \t \t @覆蓋 \t \t \t公衆詮釋比較(表項O1,O2入口){ \t \t \t \t回報O2。 num.compareTo(o1.num); \t \t \t} \t \t}); – sol4me 2014-12-06 23:41:22

+0

@ sol4me我知道這可能聽起來很愚蠢,但我得到了這個錯誤: ReverseOrder()方法未定義類型Comparator – omarsafwany 2014-12-06 23:42:51