我想知道是否可以制作实现比较器接口的非静态内部类。
例如:。
public class A {
private Map<String, Integer> scoreMap;
private final class myComparator implements Comparator<MyOtherClass> {
private int calScore(MyOtherClass ob) {
int score = ob.someValue * ob.otherValue;
scoreMap.put(ob.getName(), score);
}
public int compare(MyOtherClass ob1, MyOtherCLass ob2) {
return Integer.compare(calScore(ob1), calScore(ob2));
}
}
}
我想使用比较器类非静态,因为我想使用非静态字段“num”并想修改它的值。有非静态比较器内部类可以吗?
附加信息
对于每个对象,我都在计算内部的分数,并进行相应的比较和排序。我需要将这些分数保存在我在comparator内计算的地图中,并希望在外部类中使用该地图进行进一步计算。
从技术上讲,没有什么能阻止你。然而从道德上来说。。。
只要您保持幂等性(运行多次并获得相同的结果),那么它就不是不正确的。然而,这是一个副作用。(使用此比较器,某些类的值会发生变化。运行另一个比较器,什么都不会改变)。副作用不一定是坏的,但它们会使程序更加复杂,更难理解和调试。
试着通过一些可怜的灵魂的眼睛来看待它,他们必须维护你的代码。一些价值观发生了变化,但他们不知道为什么。他们所做的只是比较一份无关联的名单。
不管怎样,你的例子非常抽象,所以很难判断上下文,但通常没有必要做你想做的事情。除非你有一个非常好的理由,否则这通常是要避免的。在我看来,这个非常好的理由不应该是“因为我不想再次遍历数据集”。
从您的编辑:
你试图通过不需要再次从声音中重新计算来节省自己的工作。你实际上只节省了自己少量的精力。为什么不先计算分数,存储结果,然后对结果进行排序(在分数字段上)
例如:
public static class ScoredEntry {
private SomeGameData data; //or something
private int score;
// constructor takes data + score, imagine getters, setters, I am lazy ok.
}
public List<ScoredEntry> scoreEntries(List<SomeGameData> gameData) {
List<ScoredEntry> result = new ArrayList<ScoredEntry>();
for (SomeGameData data : gameData) {
int score = calculateScore(data);
result.add(new SCoredEntry(score, data);
}
return result;
}
public void sortBySCore(List<ScoredEntry> list) {
Collections.sort(list, new Comparator<ScoredEntry>() {
public int compare(SCoredEntry a, ScoredEntry b) {
// etcetera.
}
}
}
问题内容: 对于Comparator类中的比较源代码 我明白之间的差别和。我不明白的是,为什么这种方法有他们。有人可以给我一个关于参数看起来像这样无法实现的示例吗? 例如 : 也可以使用以下函数定义进行编译 问题答案: 这是一个简单的示例:按重量比较汽车。我将首先以文本形式描述问题,然后以各种可能的方式演示如果省略或则将如何出错。我还将展示在每种情况下都可用的丑陋的部分解决方法。 如果您喜欢代码而
问题内容: 我对Java还是陌生的,我尝试创建一个内部类并在main内部调用该方法。但是出现编译错误,提示“非静态变量-不能从静态上下文中引用” 请帮忙 问题答案: 一个 内部 类需要的的一个实例的引用 外 类以构造。如果您的类在逻辑上不需要它,请使用修饰符将其设置为“仅嵌套类”: 编辑:要创建一个作为 内部 类的实例,您可以使用类似以下内容的方法: 或更简短地说: …但是除非您真的 想要 引用封
我尝试用降序的内部比较器类实现优先级队列,但是当我打印优先级队列时,我没有得到正确的结果。当我尝试收集相同的比较器代码时。排序以实现列表的排序(使用相同的值)。我得到了正确的结果。你能解释一下吗? 上述代码的答案是pq值为[50,40,20,10,30] 以上代码的答案是数组值为:[50,40,30,20,10]
我有以下代码: 到目前为止,代码还可以,但我无法在主方法中实例化'in',比如,因为它显示
静态内部类是指使用 static 修饰的内部类。示例代码如下: 上述示例中的 Inner 类就是静态内部类。静态内部类有如下特点。 1) 在创建静态内部类的实例时,不需要创建外部类的实例。 2) 静态内部类中可以定义静态成员和实例成员。外部类以外的其他类需要通过完整的类名访问静态内部类中的静态成员,如果要访问静态内部类中的实例成员,则需要通过静态内部类的实例。 3) 静态内部类可以直接访问外部类的
问题内容: 我有以下代码: 到目前为止,代码还不错,但是我无法像显示的那样在main方法中实例化 我该怎么做?我不想使我的课堂静止。 问题答案: 你还必须参考其他外部类。 如果内在是静态的,那将是