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

Java是否有类似于C++;通过变量值查找对象的标准库列表比较器? 爪哇中有类似于C++标准库列表的东西,它使用比较器来查找列表中的特定对象,其中的变量之一是,java,arraylist,Java,Arraylist,例如,通过检查变量比较,而不是在ArrayList中循环查找特定对象。有没有一种方法可以使用comparator对象来查找特定实例 (注意:我不想使用hashmap,因为这样会创建两个独立的列表。我希望列表的功能不必包含hashmap。) 类似于此,但对于Java: #include <algorithm> using namespace std; class Cperson { string lastname, firstname, address, ci

例如,通过检查变量比较,而不是在ArrayList中循环查找特定对象。有没有一种方法可以使用comparator对象来查找特定实例

(注意:我不想使用hashmap,因为这样会创建两个独立的列表。我希望列表的功能不必包含hashmap。)

类似于此,但对于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;    
}     
#包括
使用名称空间std;
类Cperson
{    
字符串lastname、firstname、地址、城市;
int-zipcode;
半焦态[3];
//这适用于姓氏
友元布尔运算符==(常数Cperson&左,常数Cperson&右);
朋友布尔·菲斯特科托(康斯特科佩森&左,康斯特科佩森&右);
};
布尔运算符==(常数Cperson&左,常数Cperson&右)
{    
返回left.lastname==right.lastname;
}
布尔·菲斯特科托(康斯特科佩森&左、康斯特科佩森&右)
{    
返回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);
vectorpersonlist;
//不知何故填充个人列表
Cperson searchFor;//应该包含我们要查找的名字
向量::迭代器fperson;
fperson=std::find(personlist.begin(),
personlist.end(),
搜寻,
firstEqualTo);
 > p>我相信java集()与C++的STL版本非常直接并行。您可以覆盖
equals
操作符来设置自定义比较

给定一个集合,您可以调用
mySet.contains(o)
查看集合是否包含指定的对象

在您的情况下,您首先创建一个表示个人的Java类,在一个集合中存储一组person对象,并确保重写
equals
member函数以比较第一个和最后一个名称,如果两者相同,则返回true。然后,您可以检查您的集合是否包含某个“人”


请注意,建议您在重写
equals
时,还应重写
hashCode

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

您可以使用

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);
  }
}
List johns=ArrayList();
用于(人员p:人员){
如果(p.firstname.equals(“约翰”){
johns.add(p);
}
}

如果您可以使用谷歌番石榴,请查看该问题及其答案:

更新:

如果您不喜欢Google,因此不想使用他们的库,请尝试Apache Commons Collections':

List filteredList=new ArrayList(所有人);
filter(filteredList,new Predicate()){
布尔求值(对象){
//你想干什么就干什么
}
});
缺点是Commons集合本身不使用泛型。然而,Commons Collections 3.1有一个通用版本。

我相信Java的 适合你的需要

或者,如果您希望如您所述使用ArrayList,请尝试


请注意,在使用此方法之前,您必须对数组进行排序。

或者:您是否明确尝试不执行迭代?是的,在几乎所有情况下,高级迭代都比预先编程的低级搜索慢。我简直不敢相信Java还没有某种比较器可以用于此。我的意思是,他们有用于排序的比较器,但没有用于搜索的比较器。如果我有选择的话,我宁愿不使用任何谷歌产品,因为他们的所有软件都使用非法侵犯隐私的行为。@JamesHolloway这对他们的软件产品是正确的,但我怀疑他们的低级库会这样做。不过,这仍然是一个有点政治性的选择——作为另一种选择,我可以尝试Apache的commons collections(我将更新我的答案)?您拥有的链接指向他们的文档。@JamesHolloway这是DL链接:。哎哟。番石榴开源是有原因的。如果愿意,请查看其源代码。使用集合仍然需要将搜索参数传递给
包含(…)
方法(无论如何没有
获取(…)
方法),然后
等于(…)
必须为该参数返回true(这很可能会破坏
等于(…)
的约定).我怎样才能覆盖它,并拥有原始的比较工作?我想在一个列表中搜索一个名为“name”的变量,但我想要的是一个优化的搜索,而不是for循环和contentEquals()。我的错误——我的答案是基于这样的想法,即只有一个相等性测试。我想这并不适用,因为您确实在尝试对每个元素执行“测试”。很抱歉这不涉及特定的比较器,也不检索对象。如果找不到替代方法,我会这样做,但这样做可能会导致它遍历整个列表,这很慢。使用Apache中的CollectionUtils更有效。@JamesHolloway:如果要中断循环,请使用
break
,如示例1所示。我现在习惯了scala集合,它有find、filter、takeWhile、map、foreach等,这使得使用集合非常简洁,可以从Java调用集合,但它不是惯用的Java代码。
List<Person> filteredList = new ArrayList<Person>(allPersons);
CollectionUtils.filter( filteredList, new Predicate() {
  boolean evaluate(Object object) {
    //do whatever you want
  }
});