【问题标题】:Sorting objects of a class对类的对象进行排序
【发布时间】:2018-10-21 11:31:33
【问题描述】:

我正在开发一个 Java 项目,该项目要求我实现 obtainRanking() : void 函数,其描述如下:

使用 Collections 类中的类方法 sort (List) 对玩家列表进行排序,这是一种对集合对象进行排序的方法。为此,对象的类(本例中为 Player)应实现接口“Comparable”及其方法 compareTo。

到目前为止,这就是我实现接口 Comparable 的方式:

package modeloqytetet;

public interface Comparable {
    public int compareTo(Object otroJugador);
}

在 Player 类中,我是这样实现上述方法的:

@Override
    public int compareTo(Object otherJugador) {
        int otherCapital = ((Player) otherJugador).getCapital();

        return otherCapital-getCapital();
    }

现在,方法 obtainRanking() : void 应该在其他类中实现,我不知道该怎么做。我一直试图通过在互联网上查看一些示例来弄清楚,但似乎没有任何效果。

任何帮助将不胜感激。

【问题讨论】:

  • 任何名为 obtainRanking 的方法都不应返回 void。不过,您可以将 Comparator 传递给您在其他类的方法中使用的 sort 方法。
  • 也许不相关,但我认为他们的意思是他们希望你实现 Comparable 而不是你自己的 Comparable 接口
  • @Sid 我认为该方法的目的是对 Player 类的现有 ArrayList 进行排序,因此返回应该是无效的。反正命名是不对的,但我没有选它:P
  • 那么你可以直接用obtainRanking方法排序,不是吗?
  • 嗨 d3vcho!您将需要这种方法:docs.oracle.com/javase/8/docs/api/java/util/… - 将您的玩家实例放入一个集合中,使用它对其进行排序,然后您想要的排名就是他们在排序列表中的位置。希望有帮助!

标签: java


【解决方案1】:

说明告诉您实现java.lang.Comparable<T>,而不是您自己的Comparable 接口。

你应该这样做:

class Player implements Comparable<Player> {
    @Override
    public int compareTo(Player other) {
        return Integer.compare(this.getCapital(), other.getCapital());
    }

    ...
}

为什么不应该简单地将一个整数从另一个整数中减去来比较它们,请参阅here。

然后,你可以像这样实现obtainRankings:

// this name is quite bad. I would call it sortPlayersCapitalInPlace or something like that
public void obtainRankings(List<Player> players) {
    Collections.sort(players);
}

【讨论】:

  • 看起来不错!还有一件事,我不应该@Override 方法 compareTo 吗?
  • @d3vcho @Override 注释是可选的。我没有在那里写,因为我很懒...... :)。你应该写它。
  • @d3vcho 这是一个很好的做法,是的,但实际上并不是必需的。事实上,只有在 Java 7 中,使用 @Override 注释实现的 interface 方法是合法的。
  • @d3vcho 您正在覆盖它,但是如果您询问是否应该添加 @Override 注释而不是肯定的,只要您打算覆盖某些方法以使编译器测试这一事实,就应该使用它。更多When do you use Java's @Override annotation and why?
【解决方案2】:

您可以在您的obtainRankings() 方法中使用以下代码sn-ps 进行自定义排序。

对于玩家的升序,

public static void obtainRankings(List<Player> list){
        Collections.sort(list, (pl1, pl2) -> {
            return ((pl1.getCapital() > pl2.getCapital()) ? 1 : -1);
        });
    }

对于玩家的降序,

public static void obtainRankings(List<Player> list){
        Collections.sort(list, (pl1, pl2) -> {
            return ((pl1.getCapital() > pl2.getCapital()) ? -1 : 1);
        });
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-05
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    相关资源
    最近更新 更多