【问题标题】:Find index of an object in ArrayList depending on the value of an attribute in Java根据Java中属性的值在ArrayList中查找对象的索引
【发布时间】:2018-01-15 22:00:50
【问题描述】:

我正在使用 Java 7。是否可以根据特定的属性值在 ArrayList 中获取对象的索引。例如:

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);

现在有没有更好的方法无需迭代来获取 abcListname = "John" 中的对象的索引。

【问题讨论】:

  • 不,除非您使用地图或索引。
  • 即使在 Java 8 中,您也无法在不迭代的情况下获取列表中的索引,在 Java 8 中您可以将迭代隐藏在流后面,但您无法完全摆脱它。跨度>
  • 好的,谢谢:)。隐藏流后面的迭代,如?你能解释一下吗?
  • 他的意思是使用流api,例如list.stream().filter( /*your filter*/ ).collect( /*some collector, e.g. a list collector*/ ).
  • @Thomas 是 Java 7。没有可用的流。

标签: java arrays indexing


【解决方案1】:

有两种解决方案:

  • 使用像 arrayList.indexOf(value) 这样的迭代
  • 使用Hash based Data structure 就像java.util.HashSet 而不是java.util.ArrayList

【讨论】:

    【解决方案2】:

    不,但您可以使用HashMap 代替名字 作为key完整对象 作为value

    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");
    

    我希望这个替代解决方案也适合你

    【讨论】:

    • 不,这只是一个例子。但是我正在工作的场景。这不是我的解决方案。还是谢谢
    【解决方案3】:

    由于您的列表是一个 ArrayList,因此可以假定它是未排序的。因此,没有办法搜索比 O(n) 更快的元素。

    如果可以的话,您应该考虑将您的列表更改为具有示例类的特定比较器的 Set(以 HashSet 作为实现)。

    另一种可能性是使用 HashMap。您可以将数据添加为 Sample(请以大写字母开头的类名)并使用要搜索的字符串作为键。然后你可以简单地使用

    Sample samp = myMap.get(myKey);
    

    如果每个键可以有多个样本,则使用 Map>,否则使用 Map&lt;String, Sample&gt;。如果您使用多个键,则必须创建多个包含相同数据集的地图。因为它们都指向同一个对象,所以空间应该不是什么大问题。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 我是 Java 的超级新手。我将研究 LinkedHashMap 的工作原理
      【解决方案5】:

      您可以使用indexOf。您必须覆盖 Abc 类中的 equals 方法。

      【讨论】:

      • 这仍然是迭代。此外,仅仅为此覆盖 equals() 可能不是最好的方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-31
      相关资源
      最近更新 更多