Java中对对象的ArrayList进行排序

4
我有一个对象的ArrayList,我想按其值进行排序。基本上,我有9个不同的数学函数(即f1(n) = log nf2(n) = nf3(n) = n log n等)。我将1的值插入到这9个函数中,并将它们的结果与标签一起放入了一个对象的ArrayList中,如下面的代码所示。我希望对整个结果列表进行排序。
ArrayList<Object>val1 = new ArrayList<Object>();
        val1.add("f\u2081(1) = " + log(funcValues[0]));
        val1.add("f\u2082(1) = " + funcValues[0]);
        val1.add("f\u2083(1) = " + exponent(funcValues[0]));
        val1.add("f\u2084(1) = " + f4(funcValues[0]));
        val1.add("f\u2085(1) = " + squared(funcValues[0]));
        val1.add("f\u2086(1) = " + cubed(funcValues[0]));
        val1.add("f\u2087(1) = " + twoN(funcValues[0]));
        val1.add("f\u2088(1) = " + factorial(funcValues[0]));
        val1.add("f\u2089(1) = " + f9(funcValues[0]));

基本上,无论您在哪里看到log、funcValues、exponent、f4、squared等,这些都是计算数学函数答案的函数。该ArrayList的输出为:
f₁(1) = 0.0 f₂(1) = 1 f₃(1) = 1.0 f₄(1) = 0.0 f₅(1) = 1 f₆(1) = 1.0 f₇(1) = 2.0 f₈(1) = 1 f₉(1) = 0.0
我想只对数字进行排序。我尝试以以下方式实现:
class ValuesSorted implements Comparator<Object> {

        @Override
        public int compare(Object v1, Object v2) {
            if ()
            return 0;
        }
    }

我卡在if语句上了,因为我不能像这样做:if (v1.getValue > v2.getValue),因为我使用了9个不同的函数调用来获取每个值。


3
我建议创建自己的自定义类,包含函数和值。覆盖equalshashCodetoString方法,并为该类实现一个基于值字段排序的比较器Comparator - Marc Baumbach
Marc- 也可以使用 Map,可以看看我的回答。 - user949300
3个回答

2

这更像是一条评论而不是一个答案。 - x4nd3r
@voidHead的评论需要50个声望。 - Key_coder
1
@Gaurav 这样做不起作用,因为您不能在对象的ArrayList上使用Collections.sort。 - Giovanni
@Gaurav 这不是一场考试。把答案看作是对所提问题的全面回答。这样你就能写出一个好的答案了。 - skuntsel

1
你正在尝试跟踪两个东西,即值和标签。当你要跟踪两个相关的东西时,请使用 Map。在这种情况下,使用一个排序的 Map,即 TreeMap。
TreeMap map = new TreeMap<Double, String>();
// for each function, map.put(value, label), e.g.
map.put(log(funcValues[0]), "f\u2081(1)");
...
map.put(f4(funcValues[0]),"f\u2084(1)");
...
map.put(f9(funcValues[0]), "f\u2089(1)");

结果将按数字值排序。 map.values() 将按字母顺序排列标签。

看起来当我这样做时,只有三个结果输出,而值没有输出。例如,这是输出:[f₉(1) = , f₈(1) = , f₇(1) = ] - Giovanni
嗯,这是因为在这个例子中,你只有三个不同的值,0.0、1.0和2.0。在一个“真实”的例子中,会有更多的变化吗?也就是说,不要将1作为每个函数的参数,因为1的平方=1的立方=twoToThe(1)。如果你真的有重复的值,这个答案就不适用了。 - user949300

0
class Pair<X,Y>{

    private X first;
    private Y second;

    Pair(X first,Y second){
        this.first=first;
        this.second=second;
    }

    public X getX() {
        return first;
    }

    public void setX(X first) {
        this.first = first;
    }

    public Y getY() {
        return second;
    }

    public void setY(Y second) {
        this.second = second;
    }


    public Comparator<Pair<X, Y>> getComparator(){
        return new Comparator<Pair<X, Y>>() {

            @Override
            public int compare(Pair<X, Y> o1, Pair<X, Y> o2) {
                double a=(Double) o1.getY();
                double b=(Double) o2.getY();
                if(a==b){
                    return 0;
                }else if(a>b){
                    return 1;
                }else{
                    return -1;
                }
            }
        };
    }

}

public class Main{

    public static void main(String[] arg){

        List<Pair<String,Double>> val1 = new ArrayList<Pair<String,Double>>();

        val1.add(new Pair<String,Double>("f\u2081(1) = ", 0.1));
        val1.add(new Pair<String,Double>("f\u2082(1) = ", 0.2));
        val1.add(new Pair<String,Double>("f\u2083(1) = ", 0.1));
        val1.add(new Pair<String,Double>("f\u2084(1) = ", 1.1));
        val1.add(new Pair<String,Double>("f\u2085(1) = ", 1.2));
        val1.add(new Pair<String,Double>("f\u2086(1) = ", 2.0));
        val1.add(new Pair<String,Double>("f\u2087(1) = ", 2.1));
        val1.add(new Pair<String,Double>("f\u2088(1) = ", 0.3));

        Collections.sort(val1,new Pair<String,Double>("",0.0).getComparator());

        for (Pair<String, Double> pair : val1) {
            System.out.println(pair.getX()+" "+pair.getY());
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接