0

「 JavaSorting:Comparator vs Comparable Tutorial 」という記事を読んでいて、それについていくつか質問があります。

List<Employee> col = new ArrayList<Employee>();

col.add(new Employee(5, "Frank", 28));
col.add(new Employee(1, "Jorge", 19));
col.add(new Employee(6, "Bill", 34));
col.add(new Employee(3, "Michel", 10));
col.add(new Employee(7, "Simpson", 8));
col.add(new Employee(4, "Clerk", 16));
col.add(new Employee(8, "Lee", 40));
col.add(new Employee(2, "Mark", 30));

return col;
  1. これは、EmployeeオブジェクトのArrayListです。この従業員オブジェクトにいくつのアイテムを追加できますか?このようなことはできますか?

    col.add(new Employee(5, "Frank", 28, "asas", "asas"));
    

    Array[0]これは基本的に、これらすべてを含むようなオブジェクトの配列です。そして、私は実際にを介してこれらのオブジェクトの配列にアクセスしようとしていますArrayList

  2. なぜprintList静的にされるのですか?ここで他のタイプも使用できますか?

     private static void printList(List<Employee> list) {
         System.out.println("EmpId\tName\tAge");
         for (Employee e: list) {
             System.out.println(e.getEmpId() + "\t" + e.getName() + "\t" + e.getAge());
         }
     }
    
  3. 比較しながら、何thisを表し、何をo表しますか?

    public int compareTo(Employee o) {
         return this.empId - o.empId;
    }
    

    ここでどういうthis意味ですか?

4

6 に答える 6

2

追加できるアイテムはいくつですか?

Java VMのメモリがなくなるまで、リストに項目を追加できます。人為的な制限はありません。

私はこのようなことをすることができますか?

col.add(new Employee(5, "Frank", 28, "asas", "asas"))

いいえ、Employeeこれらの引数を取るコンストラクターがないためです。でも君ならできる

col.add(new Employee(5, "Frank", 28));

これにより、リスト内の2つの非常に類似しているが同一ではないインスタンスが得られます(メモリ内の異なる場所にあるため同一ではありません。すべてのフィールドの値が同じであるため類似しています)。

printListが静的になったのはなぜですか?

main()したがって、インスタンスを作成せずに静的メソッドから呼び出すことができます。TestEmployeeSort

これは何を表し、oは何を表しますか?

ソートアルゴリズムは、リスト内の2つの項目を選択compareTo()し、一方を引数としてもう一方を呼び出します。前者はになりthis、後者はになりますo

このように、ソートアルゴリズムは、比較するオブジェクトについて多くを知る必要はありません。

利点は、オブジェクトを簡単に比較できることです。欠点は、リストにnullポインタや非Employeeインスタンスが含まれていてはならないことです。

それがうまくいかない場合は、メソッドComparatorもあるを作成できますが、 2つの引数を取ります。compareTo

于 2011-08-09T12:12:21.350 に答える
2

ジョン、

  1. col.addは1つのBjectのみを受け入れます。したがって、新しい操作で1つのEmployeeオブジェクトを作成し、それにリストを追加します。したがって、これを使用することはできません-Employeeオブジェクトにはそのようなコンストラクターがないため、new Employee(5、 "Frank"、28、 "asas"、 "asas")。そのようなコンストラクターがある場合でも、1つのEmployeeオブジェクトのみが作成されます。

  2. 非静的メソッドを使用するには、最初にTestEmployeeSortobjectを作成する必要があるため、printLineは静的です。ただし、printLineはTestEmployeeSortobjectの内部状態を使用しないため、(非静的オブジェクトを作成するための)意味がありません。したがって、この場合は静的である可能性があり、静的である必要があります。

  3. compareToは、whiが他のものよりも大きいことを定義します。APIを参照してください。戻り値:このオブジェクトは指定されたオブジェクトよりも小さい、等しい、または大きいため、負の整数、ゼロ、または正の整数。

したがって、その場合、作成者は、Idが大きいほどEmployeeが大きいと判断します。そのメソッドを変更して、他のフィールドを使用して並べ替え順序を定義できます。

于 2011-08-09T12:15:56.557 に答える
1

これは、オブジェクトの現在のインスタンスを参照します。oは、compareTo関数のEmployeeパラメーターです。リスト内のオブジェクトを比較する方法を知らずにリストを並べ替えることはできません。この場合は、従業員IDを比較します。

また、 System.out.println(e.toString());

各フィールドのゲッターを呼び出す代わりに、EmployeeのtoStringメソッドをオーバーライドします。

于 2011-08-09T12:08:40.977 に答える
1
  1. クラス変数とコンストラクターを変更すると、Employeeオブジェクトにさらに「アイテム」を追加できます。

    public class Employee {private int empId; プライベート文字列名。プライベート整数年齢;

    // add new var
    private Object x;
    
    public Employee(int empId, String name, int age) {
        // set values on attributes
    }
    
    // add new construct
    public Employee(int empId, String name, int age, Object x) {
        //set the other attributes
    
        // this.x represents the current instance's x property, and x represents the parameter from the construct
        this.x = x;
    }
    // getters & setters
    

    }

オブジェクトを取得するには、myList.get(index)..をお勧めします。

  1. もちろん、printListメソッドに新しい変数を追加することもできます。
  2. @Sleepersonからの回答を参照してください
于 2011-08-09T12:11:53.393 に答える
1

最初の質問:いいえ、別のコンストラクターがない限りできません

Employee (int, String, int, String, String)

2番目の質問:あなたが何を求めているのかわかりません...他の誰かが助けてくれると確信しています。

3番目の質問:「this」はメソッドcompareToを呼び出す従業員を表し、「o」は引数として渡される従業員を表します。ほとんどのcompareToメソッドは、オブジェクトが等しい場合は0を返し、この場合、オブジェクトが等しくない場合はそれ以外を返します。したがって、このメソッドは従業員IDを比較します。同じ従業員の場合、this.empId--o.empIdは0を返します

于 2011-08-09T12:12:23.937 に答える
1

このようなことはできますか?

はい。

col.add(new Employee(5, "Frank", 28, "asas", "asas"))

と同じです

Employee e = new Employee(5, "Frank", 28, "asas", "asas");
col.add(e);

この従業員オブジェクトに追加できるアイテムの数

あなたはリストを正しく意味しましたか?実用的な制限はありません。

なぜprintList静的にされたのですか?

このprintListメソッドはユーティリティメソッドです。これはクラスのデータとは何の関係もなく、いくつかのユーティリティを実行し、メソッドのすべてのインスタンスに存在する必要はありません。いくつかのフォーマット、ロギングなどを行うメソッドは、一般的に静的です。

比較しながら...これは何を表し、oは何を表しますか。

compareTo、これはcompareToが呼び出される現在のオブジェクトでありo、それに渡されるオブジェクトです。だからあなたが言うときe1.compareTo(e2)e1これはこれであり、e2ですo

于 2011-08-09T12:15:14.357 に答える