我有一组对象,每个对象都有一个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按照得分(最高的第一个)存储
答案 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;
}