3

在 Java 中是否有类似于 C++ 标准库列表的东西,它使用比较器通过其变量之一在列表中查找特定对象?

例如,不是通过检查变量比较来遍历 ArrayList 来查找特定对象。有没有办法使用比较器对象来查找特定实例?

(注意:我不想使用哈希图,因为这会创建两个单独的列表。我想要列表的功能,而不必涉及哈希图。)

像这样的东西,但对于 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;    
}     

现在我们可以在名字字段上搜索我们的个人列表,忽略其他字段:

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,请查看该问题及其答案:Filtering on List based on one property with guava

更新

如果您不喜欢 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 本身不使用泛型。但是,Commons Collections 3.1有一个通用端口

于 2012-04-23T13:30:47.333 回答
1

您始终可以java.lang.Comparable为您的特定情况添加一个实现。

于 2012-04-23T13:30:12.750 回答
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 回答
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 回答