【问题标题】:Java sort through 3 classesJava对3个类进行排序
【发布时间】:2014-02-26 19:45:18
【问题描述】:

如何按索引对事件进行排序?

我的项目的简单视图:

class Event{
    int index; 
}

class EventField{
    Event[] field;
}

class Action{
    EventField ev;
    ev.sort();    // Sort event in field EventField by index
}

【问题讨论】:

    标签: java arrays class sorting


    【解决方案1】:

    Arrays.sort() 与正在使用Comparator<Event>Comparator<Event> 一起使用

    Arrays.sort(ev.field, new Comparator<Event>(){
        @Override
        public int compare(Event e1, Event e2) {
            return Integer.compare(e1.index, e2.index)
        }
    });
    

    【讨论】:

      【解决方案2】:

      在 Java 中,您有两种定义顺序的方法,您可以创建 Comparator 来创建排序策略,或者定义实现 Comparable 的类的 natural-order

      使用比较器的示例:

      class Event{
      
      private int index;
      public static final Comparator<Event> INDEX_COMPARATOR = new MyComparator();
      
      //TODO define getters and setter equals & hashCode cause it's strong recommended
      
      static class MyComparator implements Comparator<MyClass>{
      
                  @Override
                  public int compare(Event o1, Event o2) {
                      return Integer.valueOf(o1.index).compareTo(o2.index);
                  }    
      }
      
      }
      

      然后在 EventField 中。

      例子:

      class EventField{
          Event[] fields;
      
         public void sort(){
           Arrays.sort(fields,Event.INDEX_COMPARATOR );
         }
      
       }
      

      阅读更多:Collections#sort(..)

      如果您想定义类的自然排序,只需定义

      public class Event implements Comparable<Event>{
              private int index;
      
              //define getter&setter & recommended equals & hashCode    
      
              @Override
              public int compareTo(Event o) {
                 return Integer.valueOf(index).compareTo(o.index);
              }
      }
      

      在 EventField 代码中:

         Arrays.sort(fields); // where fields is Event[]
      

      【讨论】:

        【解决方案3】:

        你需要实现EventField中的方法

        class EventField{
            Event[] field;
        
            public void sort(){ Arrays.sort(field, yourCustomComparatorInstance }
        }
        

        Event 上使用自定义Comparator 进行排序

        相关:

        【讨论】:

        • 作为您的相关问题,不要使用return o1.getX() - o2.getX();,因为当您将接近Integer.MIN_VALUE 的数字与接近Integer.MAX_VALUE 的数字进行比较时,它可能会溢出。见this
        【解决方案4】:

        如果您在程序中自然会经常比较事件,您可以扩展Comparable 接口:

        public class Event implements Comparable<Event> {
            private int index;
        
            public int getIndex() {
                return index;
            }
        
            @Override
            public int compareTo(Event o) {
                return index == o.getIndex() ? 0 : (index > o.getIndex() ? 1 : -1);
            } 
        }
        

        然后您可以拨打Arrays.sort(ev.getField())。如果 'field' 中的对象总是要排序的,那么只要你添加一些东西,你就可以保持它的对象排序。

        【讨论】:

          猜你喜欢
          • 2023-03-21
          • 2016-06-25
          • 2011-07-20
          • 2016-03-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-27
          相关资源
          最近更新 更多