1

binarySearch() メソッドを呼び出して検索操作を実行する場合、コンパレーターまたは同等のものを実装する必要がありますか? binarySearch() メソッドを呼び出そうとすると、例外が発生します。

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;

class Student implements{
private int id;
private String name;

public Student(int id, String name){
    this.id = id;
    this.name = name;
}

public Student() {
    // TODO Auto-generated constructor stub
}

public int getId(){
    return id;
}
public String getName(){
    return name;
}

}
public class CollectionSearchDemo {


public static void main(String[] args) {

    List<Student> list = new ArrayList<Student>();
    list.add(new Student(3, "ouier"));
    list.add(new Student(2, "fdgds"));
    list.add(new Student(7, "kiluf"));
    list.add(new Student(1, "6trfd"));
    list.add(new Student(8, "hjgas"));
    list.add(new Student(5, "ewwew"));

    Collections.sort(list, new Comparator<Student>() {

        @Override
        public int compare(Student arg0, Student arg1) {

            return arg0.getId() - arg1.getId();
        }
    });

    Iterator iterator = list.iterator();
    while(iterator.hasNext()){
        Student student = (Student) iterator.next();
        System.out.print(student.getId()+":"+student.getName()+" ");
    }

    System.out.println("I want to do searching ");
    System.out.println("\n2 is at:"+Collections.binarySearch(list, 2, new Student()));
            // facing exception when i invoke binarySearch method.
}
}

「new Student()」や「CollectionSearchDemo」を引数に検索しようとすると例外が発生します。binraySearch メソッドの引数として何を渡す必要があるかわかりません。

私を助けてください

4

5 に答える 5

4

使い方は2通りありますCollections.binarySearch。要素とキーのリストだけを持つ最初の要素ですが、これらの要素は を実装する必要がありますComparable。キーとコンパレータを使用する2番目の方法。Studentを実装したくない場合はComparable、これを使用する必要があります。

したがって、次のように記述する必要があります。

 Collections.binarySearch(list, studentToBeFound, comparator);

インスタンスでstudentToBeFoundありStudent、コンパレータは でComparator<Student>使用したものと似ていますCollection.sort()

と比較する以前の Comparator を再利用するだけIdです:

private static final class StudentComparator implements Comparator<Student> {
  @Override
  public int compare(Student arg0, Student arg1) {

    return arg0.getId() - arg1.getId();
  }
}

次に、ID が 2 の学生を検索する場合は、次のようにします。

Student studentToBeFound = new Student(2, "dummy string");

そして、binarySearch でそれらを使用します。

int indexInList = Collections.binarySearch(list, studentToBeFound, new StudentComparator());
于 2013-02-15T14:45:54.127 に答える
1

簡単な答えはイエスです。バイナリ検索では、Student検索対象がリスト内のそれぞれよりも「大きい」か「小さい」かがわからないため、検索できません。コンパレーターに既にあるコードを使用して、
比較可能なものを実装したいとします。Student

public class Student implements Comparable<Student> {
//stuff
 @Override
 public int compareTo(Student o) {
  return getId() - o.getId();
 }
}

次に、コードは次のようになります。

final Set<Student> set = new TreeSet<Student>();
//add students etc...
final Student found = Collections.binarySearch(set, studentToLookFor);
于 2013-02-15T14:45:34.920 に答える
1

binarySearch メソッドの 3 番目のパラメーターは Comparator である必要があります。クラス Student が Comparator インターフェイスを実装していないため、例外がスローされます。

binarySearch(List list, Object key, Comparator c)

ここを読む: http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html

パラメータ c は、Comparator を実装するクラスのインスタンスである必要があります。

于 2013-02-15T14:43:56.253 に答える
1

二分探索にはソートされたリストが必要です。

この種の検索は、パーティションに基づいています。

  1. 中央の要素を取得し、それを参照と比較します。
  2. バイナリ検索は、比較で参照が「低い」と示されている場合はコレクションの前半で続行され、「高い」場合は後半で続行されます。
  3. 比較が を返した場合0、要素が見つかりました。

これを念頭に置いて、リストがソートされていることは実際には要件です。さまざまな方法でそれを行うことができます:

  • a を使用してソートしてComparatorから呼び出すbinarySerarch
  • インターフェイスを実装する要素のコレクションを並べ替えてComparableから呼び出すbinarySearch
  • 必要binarySearchComparator.
于 2013-02-15T14:51:37.677 に答える
1

リストを並べ替える方法がわからない場合、リストをソートすることはできません。二分探索アルゴリズムでは、リストをソートする必要があり、リストの順序を使用してリストを検索し、反復ごとに検索フィールドを半分にカットします。しかし、生徒 x がリストの前半にあるかリストの後半にあるかという概念では、このリストがどのようにソートされているかを知っている必要があります。

オプション1:public class Student implements Comparable<Student>

オプション 2: 生徒用の Comparator クラスを作成します。

public class StudentComparator implements Comparator<Student>

于 2013-02-15T14:49:39.667 に答える