当前位置: 首页 > 知识库问答 >
问题:

如何使用单独的比较器类对数组列表进行排序

华温书
2023-03-14

是的,这是家庭作业,但我一直在想什么。comparator类应该实现java。util。sort()方法的第二个参数应该是我的Comparator类的一个实例。

到目前为止,我的comparator类如下所示:

import java.util.Comparator;

public class Compare implements Comparator<Rational> {

    public int compare1(int a, int b){
        int z = 0;

        if(a > b)
            z = 1;
        else if(b > a)
            z = -1;
        return z;
    }

    @Override
    public int compare(Rational a, Rational b) {
        // TODO Auto-generated method stub
        return 0;
    }
}

我有一个单独的方法对数组进行排序,但此方法使用compareTo()

public static Collection<Rational> sort1(List<Rational> list){
    List<Rational> sortedList1 = new ArrayList<Rational>();

    for (int i=0;i < list.size();i++) { //iterating through list
        Rational currentValue = list.get(i);

        int pos = sortedList1.size(); 
        for (int j=0;j<sortedList1.size();j++) {
            int comparison = currentValue.compareTo(sortedList1.get(j)); //comparing
            //this is the right position if the currentValue is greater or equal 
            //to the sorted value at this position
            if(comparison > 0 || comparison == 0){
                pos = j;
                break;
            }
        }
        sortedList1.add(pos, currentValue);
    }
    return sortedList1;
}

除了使用单独的comparator类之外,我应该使用什么方法?我完全不知道该怎么办。

我的Rational类看起来像:

公共类Rational实现可比较{

    private int num;   // the numerator
    private int den;   // the denominator

    // create and initialize a new Rational object
    public Rational(int numerator, int denominator) {
        if (denominator == 0) {
            throw new RuntimeException("Denominator is zero");
        }
        int g = gcd(numerator, denominator);
        num = numerator / g;
        den = denominator / g;

    }

    // return string representation of (this)
    public String toString() {
        if (den == 1) {
            return num + "";
        } else {
            return num + "/" + den;
        }
    }

    // return (this * b)
    public Rational times(Rational b) {
        return new Rational(this.num * b.num, this.den * b.den);
    }

    // return (this + b)
    public Rational plus(Rational b) {
        int numerator = (this.num * b.den) + (this.den * b.num);
        int denominator = this.den * b.den;
        return new Rational(numerator, denominator);
    }

    // return (1 / this)
    public Rational reciprocal() {
        return new Rational(den, num);
    }

    // return (this / b)
    public Rational divides(Rational b) {
        return this.times(b.reciprocal());
    }

    /** ***********************************************************************
     * Helper functions
    ************************************************************************ */
    // return gcd(m, n)
    private static int gcd(int m, int n) {
        if (0 == n) {
            return m;
        } else {
            return gcd(n, m % n);
        }
    }

    /** ***********************************************************************
     * Test client
    ************************************************************************ */
    public static void main(String[] args) {
        Rational x, y, z;

        // 1/2 + 1/3 = 5/6
        x = new Rational(1, 2);
        y = new Rational(1, 3);
        z = x.plus(y);
        System.out.println(z);

        // 8/9 + 1/9 = 1
        x = new Rational(8, 9);
        y = new Rational(1, 9);
        z = x.plus(y);
        System.out.println(z);

        //  4/17 * 7/3 = 28/51
        x = new Rational(4, 17);
        y = new Rational(7, 3);
        z = x.times(y);
        System.out.println(z);

        // 203/16957 * 9299/5887 = 17/899
        x = new Rational(203, 16957);
        y = new Rational(9299, 5887);
        z = x.times(y);
        System.out.println(z);

        // 0/6 = 0
        x = new Rational(0, 6);
        System.out.println(x);

    }

    public int compareTo(final Rational a, final Rational b) {
        return b.compareTo(a);
    }

    @Override
    public int compareTo(Rational arg0) {
        // TODO Auto-generated method stub
        return 0;
    }
}

共有3个答案

易京
2023-03-14

您自己给出答案:“sort()方法的第二个参数应该是我的Comparator类的一个实例。”所以第一行改为

public static Collection<Rational> sort1(List<Rational> list,final Comparator<Rational,Rational> comparator){

此参数可用于在您的方法中进行比较。

comparator.compare(...)
司寇山
2023-03-14
public class MyCompare implements Comparator<Rational> {

@Override
public int compare(final Rational a, final Rational b) {
    return a.compareTo(b);
}
}

然后:

Collections.sort(list, new MyCompare());
彭梓
2023-03-14

我会使用

Collections.sort(list, RationalComparator.INSTANCE);

比较器看起来像

enum RationalComparator implements Comparator<Rational> {
   INSTANCE;

   public int compare(Rational a, Rational b) {
       // do your comparison here
   }
}
 类似资料:
  • 我一直在做拼字游戏作业。我需要从列表中读取单词,然后读取每个字符并赋值,最终为每个单词分配一个总分。已经完成了!唷。现在我需要使用比较器将单词从最高分到最低分进行排序。读了很多,还是很迷茫。我知道我可以使用接口,但也有使用lambda表达式的比较器,这是我想去的方向。我只是不知道该怎么做。我需要比较每个单词的sumValue,然后按降序打印单词。 我创建了 2 个循环来读取单词 (i),然后是字符

  • 问题内容: 说,我们有以下二维数组: 应该如何声明Java 类以使用降序按数组的第一个元素对数组进行排序?供参考的功能是: 问题答案: […]应该如何声明Java Comparator类以按其降序将数组的第一个元素排序 […] 这是使用Java 8的完整示例: 输出: 对于Java 7,你可以执行以下操作: 如果你不幸无法在Java 6或更早版本上运行,请执行以下操作:

  • 问题内容: 我需要使用自定义比较器对整数数组进行排序,但是Java的库没有为带有比较器的整数提供排序功能(比较器只能与对象一起使用)。有没有简单的方法可以做到这一点? 问题答案: 如果你无法更改输入数组的类型,则将执行以下操作: 这可以使用ArrayUtilscommons-lang项目轻松地在和之间进行转换,创建数组的副本,进行排序,然后将排序后的数据复制到原始数据上。

  • 我有以下清单: 这是我的比较器函数: 我正在尝试使用它排序如下: 我不明白为什么第一个NaN不在列表的末尾。 我对升序排序列表的预期输出是: 我对降序排序列表的预期输出是: 在升序排序和降序排序的情况下,我希望NaNs在最后。 我知道sortwith使我们能够编写自己的比较器。有人能帮我吗?

  • 我需要测试的地方 有人能告诉我如何使用main中的getCompByName()按名称对ArrayList进行排序吗?我对比较器很陌生,对它们的用法很难理解。该方法返回一个比较器,所以我不确定这将如何实现。我知道我需要使用getCompByName()来排序,我只是不知道如何实现它。

  • 所以我正在使用一些预先存在的比较器,它们比较两个元组中的某些值,如果第一个大于第二个,则返回true,否则返回false。这是其中之一的代码: 现在,我有一个字典,里面有许多上面比较的类型的元组条目。我想以相反的顺序对它们进行排序,但我真的不知道如何完成。我在想这样的事情: 但是我不知道向比较器传递什么,因为每个比较器都有两个参数(subInfo1、subInfo2)。我不能更改比较器函数。