2014-12-06 97 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