【问题标题】:Java Enum sorting descending to the value [duplicate]Java Enum降序排序到值[重复]
【发布时间】:2015-08-12 22:17:10
【问题描述】:

我在尝试正确完成排序时遇到了一点问题。我有一个引用枚举的 java 程序,并试图让枚举按升序和降序排序。

我的枚举如下:

public enum EnumList
{
   A("A", "D", 5),
   B("C", "E", 2),
   C("B", "G", 3);

   private final String bT;
   private final String bA;
   private final int bP;

   EnumList( String t, String a, int p )
   {
     bT = t;
     bA = a;
     bP = p;
   }

   public String getT()
   {
     return bT;
   }
   public String getA()
   {
     return bA;
   }
   public int getP()
   {
     return bP;
   }
}

我的主要是这样的:

public class EnumMain
{
   public static class main( String[] args )
   {
     List<EnumList> elist = new ArrayList<EnumList>();

     String response = null;
     Scanner input = new Scanner( System.in );

     System.out.println( "Please select how you would like the list sorted" );
     System.out.println( "A for ascending, D for descending." );
     System.out.println( "Please select sort order: " );
     response = input.nextLine().toUpperCase();

     if( response.equals( "A" ) )
     {
        elist.SortOrder(ASCENDING).valuesOf( getT() );
     }
     else if( response.equals( "D" ) )
     {
       elist.SortOrder(DESCENDING).valuesOf( getT() );
     }
     else
     {
        System.out.println( "You have chosen a wrong response, please try again." );
        response = input.nextLine().toUpperCase();
     }
  }
}

这个问题是不管我做什么输出总是:

A D 5
C E 2
B G 3

不确定我做错了什么才能使其正常工作。我一直在搜索所有内容,但 http://docs.oracle.com/javase/7/docs/api/javax/swing/SortOrder.html 的文档还有很多不足之处。从我在那里阅读的内容来看,它看起来是正确的,但它不起作用。

【问题讨论】:

  • 您要对它进行排序的字段是什么?
  • 第一个字段应该是排序的那个......输出中的那个是 A C B 。我知道第二个字段是按升序排序的,但它是这样排列的。

标签: java sorting enums


【解决方案1】:

您可以使用列表中的Collections.sort,它只是一个衬里:

...
if (response.equals("A")) {
    Collections.sort(elist, (o1, o2) -> Integer.compare(o1.getP(), o2.getP()));
}
else if (response.equals("D")) {
    Collections.sort(elist, (o1, o2) -> Integer.compare(o2.getP(), o1.getP()));
}
...

【讨论】:

  • 成功了,谢谢。
【解决方案2】:

要对List&lt;EnumList&gt; 进行排序,我将求助于使用java.util.Collections 类(它们是枚举字段并不重要 - 像对待任何普通 Java 对象一样对待它们):

if(response.equals("A")) {
  // sort in ascending order
  Collections.sort(elist, new Comparator<>() {
    public int compare(EnumList itemOne, EnumList itemTwo) {
      return itemOne.getT().compareTo(itemTwo.getT());
    }
  });
} else if(response.equals("D")) {
  // sort in descending order
  Collections.sort(elist, new Comparator<>() {
    public int compare(EnumList itemOne, EnumList itemTwo) {
      return itemTwo.getT().compareTo(itemOne.getT());
    }
  });
}

PS:在 Java 8 中,您可以使用等效的 Lambda 表达式:

if(response.equals("A")) {
  // sort in ascending order
  Collections.sort(elist, (itemOne, itemTwo) -> itemOne.getT().compareTo(itemTwo.getT()));
} else if(response.equals("D")) {
  // sort in descending order
  Collections.sort(elist, (itemOne, itemTwo) -> itemTwo.getT().compareTo(itemOne.getT()));
}

【讨论】:

  • 很遗憾我没有使用 Java 8,我习惯于在 C# 中使用 lambda 表达式。你能把我的 itemOne 和 itemTwo 换成相反的方向吗?
  • 正确,itemTwo.getT().compareTo(itemOne.getT()) 会给你降序。或将结果与-1 相乘。
  • @MikeMastro 顺便说一句。你怎么会接受不是按问题第一列排序的答案,而是最后一个(整数)?
  • 其实我在response.equals中使用了A和D来表示升序和降序。
  • 我明白了。但我指的是您对您的问题的评论“第一个字段应该是排序的...”
猜你喜欢
  • 1970-01-01
  • 2020-10-12
  • 1970-01-01
  • 2020-08-26
  • 2016-10-17
  • 1970-01-01
  • 2016-03-03
  • 1970-01-01
  • 2013-09-26
相关资源
最近更新 更多