【问题标题】:compareTo method for ordering integers用于排序整数的 compareTo 方法
【发布时间】:2014-03-21 03:16:08
【问题描述】:

我很难为我的程序创建 compareTo() 方法。我的程序从命令行读取 5 对字符串/整数。它们将代表 Person 对象的姓名和年龄。

例如我的命令行参数是:Asia 19 Java 20 Html 25 CSS 18 Ruby 10

我的目标是在一个对话框中显示它们,从最小到最大的数字重新排列。

*我需要帮助的问题是我的 compareTo() 方法。我有点卡在这一点上,因为我认为我不理解使用这种方法的概念。如果有人能给我一个信息丰富的解释,那就太棒了! 我的代码:

// To display dialog box(s)
import javax.swing.JOptionPane;
//An interface used to compare two objects.
import java.lang.Comparable; 

public class searchSort{
   public static void main(String[] args){
      if (args.length != 10){
         System.out.println("Please enter 5 String/Intger pairs " +
            "on the commandline");
      }
      else{
         int age1 = new Integer(0);
         int age2 = new Integer(0);
         int age3 = new Integer(0);
         int age4 = new Integer(0);
         int age5 = new Integer(0);
         try{
            age1 = Integer.parseInt(args[1]);
            age2 = Integer.parseInt(args[3]);
            age3 = Integer.parseInt(args[5]);
            age4 = Integer.parseInt(args[7]);
            age5 = Integer.parseInt(args[9]); 
         }
         catch (NumberFormatException exception) {
            System.out.println("Error: Commandline arguments 2,4,6,8,10 must be a positive integer.");
            System.exit(0); // end program
         }

         Person[] arr = new Person[5];
         arr[0] = new Person(args[0], age1);
         arr[1] = new Person(args[2], age2);
         arr[2] = new Person(args[4], age3);
         arr[3] = new Person(args[6], age4);
         arr[4] = new Person(args[8], age5);

         JOptionPane.showMessageDialog(null, arr[0]+ "\n" +arr[1]+ "\n"+arr[2]+ "\n"+
            arr[3] + "\n" + arr[4]);

         // 
      }
   }
}
class Person implements Comparable{
// Data Fields
   protected String name;
   protected int age;

   // Constructor
   public Person(String n1, int a1){
      name = n1;
      age = a1;
   }

   //toString() method
   public String toString(){
      String output = name + " is " + age + " years old.";
      return output;
   }

   //getAge() method
   public int getAge(){
      return age;
   }

   // compareTo() method   
   public int compareTo(Object object) throws ClassCastException{
     int person1 = this.getAge();
     int person2 = object.getAge();
      int result = this.getAge() - object.getAge(); 
      return result;
   }

}

【问题讨论】:

    标签: java arrays sorting command-line-arguments compareto


    【解决方案1】:

    Comparable 的作用是当Person 对象位于ListArray 等容器对象中时,您可以对它们进行排序。

    我建议查看 ArraysCollections 类以了解如何执行此操作。

    【讨论】:

    • 我知道,这就是我的回答中所说的
    【解决方案2】:

    compareTo(Object obj) 方法的合约要求您返回:

    • n this 被认为小于obj
    • 0 如果this 等于obj
    • n > 0 如果this 大于obj

    这样您就可以为您的班级定义排序行为。

    Arrays.sort(people);
    

    请注意,您可以通过反转返回值的符号来向后排序对象。

    附带说明,某些排序方法允许您将Comparator 与要排序的集合一起传递,这使您能够定义不同于默认排序标准的其他排序标准。

    Arrays.sort(people, new Comparator<Person>() { ... });
    

    【讨论】:

    • OP 在他的compareTo() 方法中所做的有什么不同?
    • OP 要求解释 compareTo 方法的用途,而不是不同的实现
    • 你的第一句话是假的。
    • 是吗?你能解释一下原因吗?
    • compareTo 的合同不要求您返回 -1、0 或 1。
    【解决方案3】:

    您的代码无法编译,因为您将对象用作人员。你需要投射它:

    public int compareTo(Object object) throws ClassCastException{
        return age - ((Person)object).age;
    }
    

    而且你只需要一行,就可以直接访问字段。

    【讨论】:

    • 嗯,我有点明白你在那里做了什么。它看起来类似于递归方法,至少是 return 语句。那么,对于您的样本,它将返回年龄减去比较对象的年龄是否正确?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    • 2019-09-15
    • 2017-07-16
    相关资源
    最近更新 更多