我想基于2个属性对ArrayList进行排序。首先在ID的基础上,然后在一些分数的基础上。每个条目都有一些分数。这是代码。
public class OutputSentence {
int tokenId;
double similarityScore;
String title;
String quantity;
String unit;
public OutputSentence(int tokenId,double similarityScore,String title,String quantity,String unit)
{
this.tokenId = tokenId;
this.similarityScore = similarityScore;
this.title = title;
this.quantity = quantity;
this.unit = unit;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return ("Token_ID: "+this.tokenId + " Score: "+this.similarityScore + " Title: "+ this.title + " Quantity: "+this.quantity+
" Unit: "+this.unit);
}
public int getTokenId()
{
return this.tokenId;
}
public double getSimilarityScore()
{
return this.similarityScore;
}
}
class MyComparator implements Comparator<OutputSentence>{
public int compare(OutputSentence s1, OutputSentence s2) {
// TODO Auto-generated method stub
int result = Integer.valueOf(s1.getTokenId()).compareTo(s2.getTokenId());
return result;
}
}
public static void main(String[] args){
ArrayList<OutputSentence> finalOutput = new ArrayList<OutputSentence>();
finalOutput.add(new OutputSentence(0, 0.1, "Hello1", "Half", "box"));
finalOutput.add(new OutputSentence(5, 0.7, "Coffee", "Half", "cup"));
finalOutput.add(new OutputSentence(0, 0.4, "Apple juice", "Glass", "one"));
Collections.sort(finalOutput, new MyComparator());
for(OutputSentence out:finalOutput)
System.out.println(out);
}
这给了我以下结果。
Token_ID:0得分:0.1标题:Hello1数量:半单位:方框
Token_ID:0得分:0.4标题:苹果汁数量:玻璃单位:一个
Token_ID:5得分:0.7标题:咖啡数量:半单位:杯子
但我需要这些结果。
Token_ID:0得分:0.4标题:苹果汁数量:玻璃单位:一个
Token_ID:0得分:0.1标题:Hello1数量:半单位:方框
Token_ID:5得分:0.7标题:咖啡数量:半单位:杯子
首先在token_ID的基础上排序,然后在相似度得分的基础上排序。如何编写比较器给我所需的结果?或者我必须写一个新的比较器? 我会感激你的。
答案 0 :(得分:2)
由于SimilarityScore
从高处开始排序,因此需要反转compareTo结果:
int result = Integer.valueOf(s1.getTokenId()).compareTo(s2.getTokenId());
if(result == 0){
result = s2.getSimilarityScore().compareTo(s1.getSimilarityScore());
答案 1 :(得分:1)
我写了一个新的比较器。它工作正常。在这里。
class MyComparator2 implements Comparator<OutputSentence>{
public int compare(OutputSentence s1, OutputSentence s2) {
// TODO Auto-generated method stub
int result = Integer.valueOf(s1.getTokenId()).compareTo(s2.getTokenId());
if(result==0)
{
int result1 = Double.valueOf(s2.getSimilarityScore()).compareTo(s1.getSimilarityScore());
return result1;
}
else
return result;
}
}
现在我开始了。 Token_ID:0得分:0.4标题:苹果汁数量:玻璃单位:一 Token_ID:0得分:0.1标题:Hello1数量:半单位:框 Token_ID:5得分:0.7标题:咖啡数量:半单位:杯
答案 2 :(得分:1)
我认为您想要做的是在ID相同的情况下按分数对其进行排序。你可以添加这个'if'子句来检查值是否相同,然后返回比较得分的结果,就像我在下面的代码中所做的那样:
class MyComparator implements Comparator<OutputSentence>{
public int compare(OutputSentence s1, OutputSentence s2) {
// TODO Auto-generated method stub
int result = Integer.valueOf(s1.getTokenId()).compareTo(s2.getTokenId());
if(result == 0){
//if you want to sort it by score descending, just switch s1 and s2
result = Double.valueOf(s1.getSimilarityScore()).compareTo(s2.getSimilarityScore());
}
return result;
}
}
答案 3 :(得分:1)
你可以像这样重构你的比较方法,并根据你的需要使用一个comprators列表: -
@Override
public int compare(OutputSentence s1, OutputSentence s2) {
for (Comparator<OutputSentence> comparator : listComparators) {
int result = comparator.compare(s1, s2);
if (result != 0) {
return result;
}
}
return 0;
}
答案 4 :(得分:0)
你可以试试这个:
xs
答案 5 :(得分:0)
您也可以使用Apache Commons CompareToBuilder,请参阅示例: -
public class EmployeeComparator implements Comparator<Employee> {
@Override
public int compare(Employee o1, Employee o2) {
return new CompareToBuilder()
.append(o1.getJobTitle(), o2.getJobTitle())
.append(o1.getAge(), o2.getAge())
.append(o1.getSalary(), o2.getSalary()).toComparison();
}
}
Collections.sort(listEmployees, new EmployeeComparator());