3

Java では、変数の 1 つによってリスト内の特定のオブジェクトを見つけるためにコンパレータを使用する C++ 標準ライブラリ リストに似たものがありますか?

たとえば、ArrayList をループして特定のオブジェクトを探す代わりに、変数の比較をチェックします。特定のインスタンスを見つけるためにコンパレータ オブジェクトを使用する方法はありますか?

(注: 2 つの別個のリストが作成されるため、ハッシュマップを使用したくありません。ハッシュマップを使用せずにリストの機能が必要です。)

このようなものですが、Javaの場合:

#include <algorithm>

using namespace std;

class Cperson     
{    
  string lastname, firstname, address, city;    
  int zipcode;    
  char state[3];    
  // this works for the last name    
  friend bool operator==(const Cperson& left, const Cperson& right);    
  friend bool firstEqualTo(const Cperson& left, const Cperson& right);    
};

bool operator==(const Cperson& left, const Cperson& right)    
{    
  return left.lastname == right.lastname;    
}

bool firstEqualTo(const Cperson& left, const Cperson& right)    
{    
  return left.firstname == right.firstname;    
}     

これで、他のフィールドを無視して、firstname フィールドで personlist を検索できます。

vector<Cperson> personlist;    
// fill personlist somehow

Cperson searchFor;   // should contain the firstname we want to find    
vector<Cperson>::iterator fperson;   
fperson= std::find(personlist.begin(),    
                   personlist.end(),   
                   searchFor,    
                   firstEqualTo);
4

5 に答える 5

3

Google Guava を使用できる場合は、その質問とその回答をご覧ください: Guava を使用した 1 つのプロパティに基づくリストのフィルタリング

更新

Google が気に入らず、Google のライブラリを使用したくない場合は、Apache Commons Collections を試してくださいCollectionUtils

List<Person> filteredList = new ArrayList<Person>(allPersons);
CollectionUtils.filter( filteredList, new Predicate() {
  boolean evaluate(Object object) {
    //do whatever you want
  }
});

欠点は、Commons Collections 自体が Generics を使用しないことです。ただし、Commons Collections 3.1の汎用ポートがあります。

于 2012-04-23T13:30:47.333 に答える
1

java.lang.Comparable特定のケースの実装をいつでも追加できます。

于 2012-04-23T13:30:12.750 に答える
0

Java のArrays.binarySearch(T[] a, int fromIndex, int toIndex, T key, Comparator c) がニーズに合うと思います。

または、あなたが述べたように ArrayList を使用したい場合は、Collections.binarySearch(List> list,T key, Comparator c)を試してください

これを使用する前に、配列をソートする必要があることに注意してください。

于 2012-04-23T13:43:56.743 に答える
0

Java Set (ドキュメントを参照) は、C++ STL バージョンとほとんど同じだと思います。演算子をオーバーライドしequalsて、カスタム比較を設定できます。

mySet.contains(o)セットを指定すると、そのセットに指定されたオブジェクトが含まれているかどうかを確認するために呼び出すことができます。

あなたの場合、最初に自分の人を表す Java クラスを作成し、一連の Person オブジェクトをセットに格納し、equalsメンバー関数をオーバーライドして姓と名を比較し、両方が同じ場合は true を返すようにします。次に、セットに特定の「人」が含まれているかどうかを確認できます。

equalsをオーバーライドする場合は、 もオーバーライドすることをお勧めしますhashCode

于 2012-04-23T13:30:04.010 に答える
0

使用できます

list.contains (o);

リストに特定のオブジェクトが含まれているかどうかを確認します。

述語をチェックするための簡単な組み込みメソッドはありません。ただし、C++ のセットアップよりも単純なようです。

for (Person p: persons) {
  if (p.firstname.equals ("John")) {  
     doSomethingWith (p);
     // if you only want to handle one case, the first John:
     break; 
  }
}

「John」コレクションを作成するには:

List <Person> johns = ArrayList <Person> ();
for (Person p: persons) {
  if (p.firstname.equals ("John")) {  
     johns.add (p);
  }
}
于 2012-04-23T13:30:15.607 に答える