【问题标题】:How would I sort given this code [duplicate]给定此代码,我将如何排序[重复]
【发布时间】:2018-06-30 05:15:15
【问题描述】:

我还有一个 ArrayList 项。我有从媒体派生的类。给定下面的代码,我将如何按持续时间对数组列表进行排序?例如

Collections.sort(myMedia, ?);

这是课程

import java.util.Comparator;


public abstract class Media implements Comparable<Media>{

    private int duration;
    private String title;

    private String imageFileName;

    private static String imageFileDirectory = "src/resources/";

    public Media(String name, int seconds) {
        this.title = name;
        this.duration = seconds;
        this.imageFileName = "";
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }    

    public int getDuration() {
        return duration;
    }

    public void setDuration(int d) {
        this.duration = d;
    }

    public String getImageFileName() {
        return imageFileName;
    }

    public void setImageFileName(String imageFileName) {
        this.imageFileName = imageFileName;
    }

    public static String getImageFileDirectory() {
        return imageFileDirectory;
    }

    public static void setImageFileDirectory(String imageFileDirectory) {
        Media.imageFileDirectory = imageFileDirectory;
    }

    @Override
    public String toString() {
        return  this.getTitle() 
                + ", Duration: " + this.getDuration() + "s, " +
                "Cost: " + costInPence() + "p";
    }

    public abstract int costInPence();

    @Override
    public int compareTo(Media o) {
        return this.getTitle().compareTo(o.getTitle());
    }

    public static class DurationComparator implements Comparator<Media>{
        public int compare(Media m1, Media m2) {
           return m2.getDuration() - m1.getDuration();
        }
    }

    public static class CostComparator implements Comparator<Media>{
        public int compare(Media m1, Media m2) {
           return m2.costInPence() - m1.costInPence();
        }
    }
}

【问题讨论】:

  • Collections.sort(myMedia, new DurationComparator());
  • 优秀。它有效:)
  • 你已经写了比较器!
  • 如果你想按持续时间排序,你应该使用DurationComparator。如果您想按 title 排序,则不需要指定任何比较器,因为您的 Media 对象将其定义为它们的 自然顺序(通过使用 Comparable 和 @ 987654328@).

标签: java


【解决方案1】:

Collections#sort 方法有两种变体。

第一个变体 (documentation) 只接受要排序的集合。它将按 自然顺序 对集合中的元素进行排序。因此,元素必须实现接口Comparable,该接口产生compareTo 方法。您的Media 对象已经以有意义的自然顺序实现了这个接口,即按它们的标题排序:

public abstract class Media implements Comparable<Media> {
    @Override
    public int compareTo(Media o) {
        return this.getTitle().compareTo(o.getTitle());
    }
}

其他变体 (documentation) 接受一个集合和一个Comparator 对象。然后它将根据Comparator 定义的顺序对元素进行排序。您可以通过多种方式定义Comparator,因为Java 8 变得非常紧凑。但首先让我们看一下您已经定义的Comparator,它按持续时间排序:

public static class DurationComparator implements Comparator<Media> {
    public int compare(Media m1, Media m2) {
       return m2.getDuration() - m1.getDuration();
    }
}

因此,如果您想按 titles 排序,您应该使用第一个变体。如果要按 duration 排序,则需要创建 DurationComparator 的新实例并使用第二个变体,或者使用紧凑的 Java 8 语句。您的CostComparator 也是如此:

// Sort by title
Collections.sort(myMedia);

// Sort by duration
Collections.sort(myMedia, new DurationComparator<>());

// Sort by duration with Java 8
Collections.sort(myMedia, Comparator.comparingInt(Media::getDuration));

// Sort by cost
Collections.sort(myMedia, new CostComparator<>());

// Sort by cost with Java 8
Collections.sort(myMedia, Comparator.comparingInt(Media::costInPence));

Comparator#comparing (documentation) 方法创建一个Comparator 对象,该对象根据给定的对给定的元素进行排序。方法引用指向产生键的方法。

由于方法返回int,您可以选择方法Comparator#comparing (documentation),因为int 不需要被装箱到Integer 中,所以速度稍快。

请注意,由于 Java 8 Lists 本身也提供了 sort 方法 (documentation)。所以你不需要再打电话给Collections了:

myMedia.sort(Comparator.comparingInt(Media::getDuration));

还请注意,Comparator 现在提供了一些有用的方法 (documentation),例如首先按一个键排序,如果键相等则按第二个键排序:

myMedia.sort(Comparator.comparingInt(Media::getDuration)
    .thenComparing(Media::costInPence));

【讨论】:

  • 我们实际上可以通过myMedia.sort(Comparator.comparingInt(Media::costInPence))myMedia.sort(Comparator.comparingInt(Media::getDuration)) 等使代码更紧凑并避免装箱,但这是偏好问题。
  • @Aominè 是的,我刚刚看到方法返回int。感谢您的提示。
猜你喜欢
  • 2018-03-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-20
  • 2019-12-18
相关资源
最近更新 更多