根据2个属性对ArrayList进行排序

时间:2015-08-05 10:27:23

标签: java sorting arraylist collections

我想基于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的基础上排序,然后在相似度得分的基础上排序。如何编写比较器给我所需的结果?或者我必须写一个新的比较器? 我会感激你的。

6 个答案:

答案 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());
相关问题