【问题标题】:Sort collections with objects with float value使用具有浮点值的对象对集合进行排序
【发布时间】:2016-07-21 22:41:37
【问题描述】:

假设我有一堂课:

class Area{
  String id;
  Float value;
  int startTime;
  int endTime;
  Map<Integer, List<scheduleRequest>> timeSlotMap;
}

我想根据浮点数的值对区域进行排序。

我试过了:

class Value implements Comparator<Area>{

  @Override
  public int compare(Area a1, Area a2) {
       return (int)(a1.value-a2.value); I also tried this
  }
}

主要是

    Area area1=new Area();
    area1.value=(float) 1.0;
    Area area2=new Area();
    area2.value=(float) 0.8;
    Area area3=new Area();
    area3.value=(float) 0.6;
    List<Area> list=new ArrayList<>();
    list.addAll(Arrays.asList(area2,area1,area3));
    Collections.sort(list, new Value());

但是,列表没有排序。

【问题讨论】:

  • 你设置了 area1.value 三次。尝试设置 area2.value 和 area3.value。
  • 我编辑了问题,请再看一遍。 @ShearPlane
  • 作为一个快速说明,通常你会看到浮点值1.0f,而不是显式转换(float)1.0

标签: java list object collections comparator


【解决方案1】:

将你的 main() 方法更改为

Area area1=new Area();
area1.value=(float) 1.0;
Area area2=new Area();
area2.value=(float) 0.8;  // area2 instead of area1
Area area3=new Area();
area3.value=(float) 0.6;  // area3 instead of area1
List<Area> list=new ArrayList<>();
list.addAll(Arrays.asList(area2,area1,area3));
Collections.sort(list, new Value());

【讨论】:

  • @user6119494 你的施法对减法的结果进行四舍五入。请使用Float.compare(float, float),如 BlackJoker 的回答中所述。
【解决方案2】:

1) 代替实现Comparator,实现Comparable

2) 您无需将Comparator 传递给对Collections.sort 的调用,只需传递列表即可:

Collections.sort(list);

3) 您应该在 compareTo() 方法中正确检查空值,以防止此类错误。如果 a1.value 或 a2.values 为 null,则会抛出 NullPointerException。最好提前检查null。

【讨论】:

  • 为什么使用可比较而不是比较器?
  • 因为如果你的对象是 Comparable 的,传递 Comparator 就变得不必要了。任何排序都会知道您的对象是 Comarable 并为您调用 compareTo 方法。
【解决方案3】:

尝试使用:

Math.round(a1.value-a2.value);

代替:

(int)(a1.value-a2.value);

【讨论】:

    【解决方案4】:

    这里的-应该换成,

    class Value implements Comparator<Area>{
    
      @Override
      public int compare(Area a1, Area a2) {
           return Float.compare(a1.value, a2.value); // try it now
      }
    }
    

    a1.value, a2.value 应该是浮点值时它会起作用

    【讨论】:

      猜你喜欢
      • 2019-02-02
      • 2021-04-26
      • 2012-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多