3

リストを次のように宣言しました

        private List<Employees> employees;

そして、DAOを使用してデータベースから値を取得しています

        employees= new ArrayList<Employees>();
        employees.addAll(myDAO.getEmployees());

で値を検索したいのですが、 で値を検索するためemployees Listの最良の方法は何employees Listですか?

私が試してみました

    Collections.sort(employees);
    int index = Collections.binarySearch(employees, "abc");

ただし、キャスト例外が発生しています

どんな助けでも大歓迎です。

ありがとう

4

6 に答える 6

6
Collections.sort(employees); // BigO - nlog(n)
int index = Collections.binarySearch(employees, new Employee("abc",...)); // BigO - log(n)

リストを並べ替えて検索するたびに、コードの複雑さは、リストの並べ替えとバイナリ検索のnlog(n) + log(n)場所になります。nlog(n)log(n)

リストを直線的に検索する方がよいでしょう。ライナー検索はBigO - n、以前のアプローチよりも優れたパフォーマンスを発揮します。


従業員をキャストしてレイズできないリストが含まれているためcast Exception、メソッドに入っていますCollections#sortnull valueClassCastException

于 2013-02-18T12:25:09.860 に答える
1

あなたは正しい軌道に乗っています。Employees の equals メソッドを単純にオーバーライドします (これは Employee であるべきではありませんか? 従業員のコレクションを記述しているのか、それとも 1 つだけを記述しているのか?)

その後、コードが機能するはずです。上記のように従業員を並べ替えて、コンパレータを提供することもできます。

Collections.sort(fields, new Comparator<Employee>() {
    @Override
    public int compare(Employee o1,Employee o2) {
        // TODO Rerturn 0 if equal or either 1 or -1 depending which of o1 or o2 is the bigger
    }
})

後者のアプローチでは、equals メソッドをオーバーライドする必要はありません。

于 2013-02-18T12:27:21.730 に答える
1
Employees lookingForValue(String value, List<Employees> employees)
{
    for (Employees employee : employees)
    {
       if (value.equals(employee.getFieldValue()))
       {
          return employee;
       }
    }
    return null;
}  

利用方法

lookingForValue("abc", employees);
于 2013-02-18T12:25:21.097 に答える
1

使えない場合

myDAO.getEmployees(parameter);

そしてDAOにwhere句 を入れてから、forを実行してオブジェクトを検索できます

Employee emp = null;

    for(Employee e : employees) {
       if(e.getName().equals("X"))
           emp = e;
    }

    if(emp != null) {
      //handle the found employee
    }
    else {
      //employee not in list
    }

その equals メソッドをオーバーライドし、その列でオブジェクトをインスタンス化して使用することもできます (お勧めしません)。

myDAO.getEmployees().get(object);
于 2013-02-18T12:25:38.920 に答える
1

リストを反復処理し、検索アクションを実行します。

String searchString = "abc";
for(Employee employee: employees) {
  if(employee.getName().equals(searchString)) {
    // Found something!
  }
}

のすべてのフィールドを検索する場合は、インスタンスのすべてのフィールドをチェックEmployeeする にメソッドを作成することをお勧めします。Employee

boolean findString(String searchString) {
  if(getName().equals(searchString)) return true;
  if(getCity().equals(searchString)) return true;
  // etc..
  return false;
}

for-loopでこのメソッドを使用します。

于 2013-02-18T12:26:19.407 に答える
1

リストが非常に大きい場合は、DAO で検索を行うことをお勧めします。dbs は、この種の検索で最高のパフォーマンスが得られるように調整できます (例: select * from employees where name = 'abc')。次に、一致する項目のみを返す DAO メソッドを用意します。

別の優れた代替手段は apache-commons Predicateです

例えば

matches = CollectionUtils.filter(employees, new Predicate<Employee>()
{
  @Override
  public boolean evaluate(Employee object)

    return "abc".equals(object.getName());
  }
});

明らかに、「abc」をパラメータ化します。Predicate を再利用する場合は、名前付きクラスにします。

述語の実装は、セットをフィルタリングするさまざまな方法がある場合に特に役立ちます。さらに、真の等値チェックのために equals を解放します。

于 2013-02-18T12:26:34.683 に答える