我使用的是Java 7.是否可以根据特定的属性值获取ArrayList中Object的索引。例如:
class Abc{
String first_name;
String last_name;
// getter and setters...
}
现在
List<Abc> abcList = new ArrayList();
Abc abcObj = new Abc();
abcObj.setFirst_name("Jeet");
abcObj.setLast_name("Adhikari");
abcList.add(abcObj);
Abc abcObj2 = new Abc();
abcObj2.setFirst_name("John");
abcObj2.setLast_name("Something");
abcList.add(abcObj2);
现在有没有更好的方法可以在 abcList 中获取对象的索引,其中 name =&#34; John&#34; 。
答案 0 :(得分:4)
不,但您可以使用HashMap代替名字作为key
,完整对象作为value
< / p>
HashMap<String, Abc> abcMap = new HashMap<String, Abc>();
Abc abcObj = new Abc();
abcObj.setFirst_name("Jeet");
abcObj.setLast_name("Adhikari");
abcMap.put(abcObj.getFirst_name(), abcObj);
Abc abcObj2 = new Abc();
abcObj2.setFirst_name("John");
abcObj2.setLast_name("Something");
abcMap.put(abcObj2.getFirst_name(), abcObj2);
然后你可以通过调用例如
来获得完整的对象Abc objectByKey = abcMap.get("John");
我希望这个替代解决方案也适合你
答案 1 :(得分:4)
由于您的列表是ArrayList,因此可以假定它是未排序的。因此,无法搜索比O(n)更快的元素。
如果可以,您应该考虑将您的列表更改为Set(使用HashSet作为实现),并为您的示例类使用特定的Comparator。
另一种可能性是使用HashMap。您可以将数据添加为Sample(请使用大写字母启动类名称)并使用要搜索的字符串作为键。然后你可以简单地使用
Sample samp = myMap.get(myKey);
如果每个键可以有多个样本,请使用Map&gt;,否则使用Map<String, Sample>
。如果使用多个键,则必须创建包含相同数据集的多个映射。因为它们都指向相同的对象,所以空间不应该成为一个问题。
答案 2 :(得分:1)
您可以使用indexOf。您必须覆盖Abc
类中的equals方法。
答案 3 :(得分:1)
有两种解决方案:
{
"status": "ok",
"statusCode": "11011",
"statusDescription": "Service: Get Profile ; Market: US ; Locale:en-US ; SourceId:DCS; ApiUid: 644e1dd7-2a7f-18fb-b8ed-ed78c3f92c2b; Description: The get profile call was successful.",
"details": {
"dcsId": "rfggrg",
"marketCode": "US",
"languageCode": "en",
"profile": {
"base": {
"username": "abc",
"firstName": "xc",
"middleName": "test",
"lastName": "123",
"shortName": "xc",
"displayName": "D",
"suffix": "T",
"prefix": "E"
}
}
}
}
arrayList.indexOf(value)
代替java.util.HashSet
答案 4 :(得分:0)
我不知道您的解决方案背后的要求,但我会考虑使用LinkedHashMap而不是ArrayList。