Java:按分数排序ID

时间:2015-03-16 09:41:25

标签: java arrays sorting dictionary

我有一组对象,每个对象都有一个id值(int)。 我想写一个函数,它将对象设置为输入,计算每个对象的分数(double),并返回一个对象id的排序数组,其中返回的id按照获得的“得分”的顺序存储。

我认为这很容易,但我找不到一种简单的方法,可以在不到10行代码中实现这一点。 (我正在使用jdk 7)

这是我的代码:

private ArrayList<Integer> getBlockIds(IndexKey key) {
    ArrayList<Integer> blockIds;
    Set<IndexKey> adjKeys = indexAPI.getAdjacentKeys(key, 1);
    Comparator cmp = new Comparator("Levenshtein"); 
    for ( IndexKey aKey : adjKeys ) {
        if ( cmp.similarity(key.getValue(), aKey.getValue()) >= 0.75 ) { 
            blockIds.add(aKey.getBlockId);
        }
    }
    return blockIds;
}

我希望blockIds按照得分(最高的第一个)存储

2 个答案:

答案 0 :(得分:1)

你实际上只需要一行。

假设:

Set<MyClass> set;

方法int getId()int getScore()

List<MyClass> sorted = set.stream().sort((a, b) -> a.getScore() - b.getScore()).map(MyClass::getId).collect(Collectors.toList());

答案 1 :(得分:0)

基于大卫的建议,Herr是我想出来的

private TreeSet<Integer> getBlockIds(IndexKey key) {
    StringDistance sd = new StringDistance("Levenshtein"); //take from config
    TreeSet<IndexKey> orderedKeys = new TreeSet<IndexKey>(new Comparator<IndexKey>() {
        @Override
        private int compare(IndexKey k1, IndexKey k2) {
            double k1Score = sd.similarity(key.getValue(), k1.getValue());
            double k2Score = sd.similarity(key.getValue(), k2.getValue());
            return k1Score.compareTo(k2Score);
        }
    });
    Set<IndexKey> adjKeys = indexAPI.getAdjacentKeys(key, 1);
    for ( IndexKey aKey : adjKeys ) {
        if ( sd.similarity(key.getValue(), aKey.getValue()) >= 0.75 ) { //take from config
            orderedKeys.add(aKey);
        }
    }
    TreeSet<Integer> blockIds;
    for ( IndexKey k : orderedKeys ) {
        blockIds.add(k.getBlockId);
    }
    return blockIds;
}
相关问题