根据Java

时间:2017-08-08 10:59:45

标签: java arrays indexing

我使用的是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;

5 个答案:

答案 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" } } } }
  • 之类的迭代
  • 使用Hash based Data structure,例如arrayList.indexOf(value)代替java.util.HashSet

答案 4 :(得分:0)

我不知道您的解决方案背后的要求,但我会考虑使用LinkedHashMap而不是ArrayList。