【发布时间】:2016-05-29 15:08:45
【问题描述】:
首先,我对 Java 8 很陌生,也许我的问题根本不适用于它...
所以,我有一个类,它有一个包 private int 和一个 String 字段。我必须按分数然后按名称比较实例。解决方案是一个必须实现 Comparator 的类,我想在 Java 8 中解决它,因为我会编写这样的代码,而不需要所需的类:
Arrays.sort(players, Comparator.comparing(Player.score).thenComparing(Player.name);
(玩家是玩家的数组)
有可能吗?重写的比较方法应该返回一个int,我什至无法获得编译代码:(
我首先尝试了这个:
public class Sorter implements Comparator<Player> {
@Override
public int compare(Player o1, Player o2) {
return (int)(p1, p2) -> Comparator.comparing(Player.score).thenComparing(Player.name);
}
}
它在 Player.score 和 Player.name 处失败,因为“不能从静态上下文引用非静态参考分数”我不明白这怎么会是静态上下文。
然后我临时为 score 和 name 创建了 getter 方法(它必须保持没有 getter),问题变成了“int 不是函数式接口”。
如果有人能说出这是否可能,我将不胜感激,如果可以,请引导我找到正确的解决方案。
非常感谢!
编辑:我的问题不是如何使用静态变量问题的重复,因为我想知道我的任务是否可以在 Java 8 中解决如果是,如何。在我的班级中有一个比较器作为一个字段,似乎可以解决这个问题(如果可以访问 getter)。
【问题讨论】:
-
您需要将
Functions 提供给comparing和thenComparing。试试Comparator.comparing(player->player.score).thenComparing(player->player.name) -
compare应该返回int而不是Comparator。如果Sorter将Comparator与 lambda 表达式作为静态最终字段,则您的compare函数可以调用其compare函数。 -
谢谢@HankD!如果我暂时为字段添加吸气剂,那效果很好。由于我无法更改给定的情况,
public class Sorter implements Comparator<Player> { private static final Comparator<Player> comp = Comparator.comparing(Player.score).thenComparing(Player.name); @Override public int compare(Player o1, Player o2) { return comp.compare(o1, o2); } }仍然存在非静态字段的问题.. 无法引用...等等。我在 .comparing: p -> ((Player)p) 中尝试了类似的操作。得分了,但还是没有结果……你有更多的想法吗? -
你能创建与 Player 包名相同的新类吗?同一包中的其他类对包私有成员具有可见性。可以编辑播放器吗?你能创建一个添加访问器的子类吗?
-
对每个问题都没有 :( 似乎具有这些限制的任务是针对良好的旧 Java 而不是 lambdas。无论如何,您在 Sorter 类中提供了带有 Comparator 字段的解决方案(工作得很好,因为 getter 是那里),所以谢谢你!
标签: arrays sorting java-8 comparator