对月份名称进行排序

时间:2013-11-15 22:09:28

标签: java

我想要对月份名称进行排序。我尝试过以下方法:

import java.util.SortedSet;
import java.util.TreeSet;

public class SortingMonth {

    public static void main(String[] args) {
        SortedSet<String> monthSet = new TreeSet<String>();
        monthSet.add("Feb");
        monthSet.add("Jan");
        monthSet.add("Mar");
        monthSet.add("Dec");
        monthSet.add("Aug");

        for(String value:monthSet){
            System.out.println(value);
        }
    }
}

输出:

Aug
Dec
Feb
Jan
Mar

但我想按此顺序输出:

Jan
Feb
Mar
Aug
Dec

7 个答案:

答案 0 :(得分:1)

可能你可以尝试不同的方式如下。 Best efficient way to sort Months and Year in Java

List<String> abc = new ArrayList<String>();
    List<Date> xyz = new ArrayList<Date>();

    abc.add("JAN-2010");
    abc.add("JAN-2011");
    abc.add("APR-2013");
    abc.add("NOV-2009");

    try {

        for (String abc1 : abc) {

            Date date;

            date = new SimpleDateFormat("MMM-yyyy", Locale.ENGLISH)
                    .parse(abc1);
            xyz.add(date);

        }

        Collections.sort(xyz, new Comparator<Date>() {

            public int compare(Date arg0, Date arg1) {
                // return arg0.getDate().compareTo(o2.getDate());
                return arg0.compareTo(arg1);
            }
        });

        for (Date date1 : xyz) {
            System.out.println("Sorted : " + date1);
        }

    } catch (ParseException e) {

        e.printStackTrace();

    }
}

答案 1 :(得分:1)

TreeSet中使用比较器,如下所示:

SortedSet<String> monthSet = new TreeSet<String>(new Comparator<String>() {
    public int compare(String o1, String o2) {
        try {
            SimpleDateFormat fmt = new SimpleDateFormat("MMM", Locale.US );
            return fmt.parse(o1).compareTo(fmt.parse(o2));
        } catch (ParseException ex) {
            return o1.compareTo(o2);
        }
    }
});

这不是很有效,但尽可能接近您的示例代码。

答案 2 :(得分:0)

如果您没有告诉TreeSet您想要哪种排序,它将使用标准字符串排序(字母顺序)。

使用带有Comparator<String>的构造函数,并创建一个根据需要对值进行排序的实例。

答案 3 :(得分:0)

没有OOTB方法来实现这一目标。您需要在某个地方进行硬核处理(无论是在比较器中还是在一些可能使用月份来处理此事件的自定义实用程序中)按月的顺序

答案 4 :(得分:0)

根据您对月份的其他想法,也许为他们创建枚举类型是值得的。见这里:

http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

答案 5 :(得分:0)

如果你将月份变成枚举,这很容易:

import java.util.SortedSet;
import java.util.TreeSet;

class SortingMonth {

  enum Month {
    Jan(1, "January"),
    Feb(2, "February"),
    Mar(3, "March"),
    //..
    Aug(8, "August"),
    //...
    Dec(12, "December");
    int id;
    String text;
    Month(int id, String text) {
      this.id = id;
      this.text = text;
    }
    public String text() {
      return text;
    }
    public int id() {
      return id;
    }
  }


  public static void main(String[] args) {
      SortedSet<Month> monthSet = new TreeSet<Month>();
      monthSet.add(Month.Feb);
      monthSet.add(Month.Jan);
      monthSet.add(Month.Mar);
      monthSet.add(Month.Dec);
      monthSet.add(Month.Aug);

      for(Month value:monthSet){
          System.out.println(value);
      }

  }

}

答案 6 :(得分:-1)

如果您需要一个包含月份名称和已排序Set<String>,则可以使用LinkedHashSet<String>。来自its javadoc(强调我的):

  

Set接口的哈希表和链表实现,具有可预测的迭代顺序。此实现与HashSet的不同之处在于它维护了一个贯穿其所有条目的双向链表。此链接列表定义迭代排序,元素插入集合(插入顺序)的顺序。

所以,就这样做:

Set<String> months = new LinkedHashSet<String>();
months.add("Jan");
months.add("Feb");
months.add("Aug");
months.add("Dec");
System.out.println(months);

输出:

[Jan, Feb, Aug, Dec]