首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Java中,“装饰和排序”的简明实现?

在Java中,“装饰和排序”的简明实现?
EN

Stack Overflow用户
提问于 2018-06-07 05:38:37
回答 3查看 128关注 0票数 0

我是第一次学习Java (我之前的经验是Python和Haskell)。我有一个场景,在Python中,需要一个“装饰和排序”的习惯用法。如下所示(代码未经过测试,但大致正确):

代码语言:javascript
复制
origList = <something>
decorated = sorted( [(evalFunc(item), item) for item in origList] )
finalList = [item for _, item in decorated]

通过选择不同的evalFunc,您可以选择如何对其进行排序。

在Java中,我正在编写一个程序,通过从音符列表中进行选择,评估每个音符的“适合性”,并选择最好的音符来创作音乐。我有一个代表音符的类:

代码语言:javascript
复制
class Note {
   ...
}

我有一个类,它将音符的适合度表示为两个值,它的好坏(是的,在我的程序中这是两个独立的概念)。注意:在Python或Haskell中,这只是一个2元组,但我的理解是Java没有通常意义上的元组。我可以把它变成一对,但是像List<Pair<Type1,Pair<Type2,Type3>>>这样到处声明变量会变得很笨拙。(顺便说一句,我也不认为Java有类型别名,这可以缩短声明。)

代码语言:javascript
复制
class Fitness {
    double goodness;
    double badness;
}

评估适合度的函数需要访问除Note之外的多个数据。我们会说它是一个“作文”类的一部分:

代码语言:javascript
复制
class Composition {
    ... data declared here ... ;

    public Fitness evaluate(Note n) {
    }
}

我希望能够按数字顺序比较Fitness对象。有两种方法可以比较:好的或坏的可以通过数字进行比较,具体取决于具体情况。

代码语言:javascript
复制
class CompareFitnessByGoodness implements Comparator<Fitness> {
}

class CompareFitnessByBadness implements Comparator<Fitness> {
}

我想将Note和它的适合度打包在一起,这样我就可以根据适合度对组合列表进行排序,然后提取出最好的Note

代码语言:javascript
复制
class Together {
    public Note;
    public Fitness;
}

我想根据好的或者坏的对List<Together>进行排序。所以我可能需要:

代码语言:javascript
复制
class CompareTogetherByGoodness implements Comparator<Together> {
    ...
}

class CompareTogetherByBadness implements Comparator<Together> {
   ...
}

最终我会写一些类似这样的东西

代码语言:javascript
复制
Note pickBest(List<Together> notes) {
    // Pick a note that's not too bad, and pretty good at the same 
    // time.

    // First sort in order of increasing badness, so I can choose
    // the bottom half for the next stage (i.e. the half "least bad"
    // notes).
    Collections.sort(notes, new CompareTogetherByBadness());
    List<Together> leastBadHalf = notes.subList(0, notes.size()/2);

    // Now sort `leastBadHalf` and take the last note: the one with
    // highest goodness.
    Collections.sort(leastBadHalf, new CompareTogetherByGoodness());

    return leastBadHalf.get(leastBadHalf.size()-1);
}

呼!对于Haskell或Python中的几行代码来说,这是非常多的代码。有没有更好的方法来做这件事?

编辑:

解决了一些答案。

“你不需要装饰。”嗯,我的适应度计算非常昂贵,所以我想为每个音符计算一次,并保存结果以供以后访问。

“把好的/坏的存储在笔记中。”笔记的好坏并不是笔记本身的属性;它只在上下文中有意义,它可以改变。所以这是一个建议,我添加了可变状态,它只在一些上下文中有意义,或者如果有一个bug意外地改变了它,那就大错特错了。这很难看,但可能是Java的一个必要的拐杖。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50730007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档