【问题标题】:ArrayList of my objects, indexOf problem我的对象的 ArrayList,indexOf 问题
【发布时间】:2011-02-15 17:19:33
【问题描述】:

我对 Java 的 ArrayList 有疑问。我创建了一个包含两个属性 x 和 y 的对象。现在我已经在我的 ArrayList 中加载了一些对象。问题是我不知道如何找到我正在搜索的具有 x 属性的某个对象的索引。有没有办法做到这一点?

【问题讨论】:

    标签: java object arraylist indexof


    【解决方案1】:

    假设如下:

    public class Point {
       public final int x;
       public final int y;
    }
    

    并声明:

    List<Point> points = ...;
    

    您可以使用 for-each 遍历所有点并找到您想要的点:

    for (Point p : points) {
       if (p.x == targetX) {
          process(p);
          break; // optional
       }
    }
    

    请注意,这不会给您索引,但它会给您Point 本身,这有时就足够了。如果你真的需要索引,那么你会想要使用索引 for 循环,使用 size()get(int index)(请参阅 BalusC 的答案)。

    另见


    上述解决方案在O(N) 中搜索每个targetX。如果您经常这样做,那么您可以通过声明 class Point implementsComparable&lt;Point&gt; 来改进这一点,使用 x 作为 Collections.sort 的主要排序键。

    那你可以Collections.binarySearch。设置时间为O(N log N),现在可以在O(log N) 中回答每个查询。

    另一种选择是使用SortedSet,例如TreeSet,特别是如果您拥有的是Set&lt;Point&gt;,而不是List&lt;Point&gt;

    另见

    【讨论】:

    • 他对索引很感兴趣。
    • @BalusC:是的,我刚刚看到了[indexOf] 标签;参考你的答案而不是重复。
    【解决方案2】:

    这是你要找的吗?

    public class Point {
    
    private final int x;
    private final int y;
    
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
    
    public int getX() {
        return x;
    }
    
    public int getY() {
        return y;
    }
    
    @Override
    public boolean equals(Object o) {
        return (o instanceof Point && getX() == ((Point) o).getX() && getY() == ((Point) o)
                .getY());
    
    }
    

    }

    public class TestIndexOf {
    
    public static void main(String[] args){
        Point p1 = new Point(10,30);
        Point p2 = new Point(20,40);
        Point p3 = new Point(50,40);
        Point p4 = new Point(60,40);
        List<Point> list = new ArrayList<Point>();
        list.add(p1);
        list.add(p2);
        list.add(p3);
        list.add(p4);
        System.out.println(list.indexOf(p3));
    }
    

    }

    如果您只想搜索 x 属性,请将 equals 方法更改为仅比较 x 值,例如:

    @Override
    public boolean equals(Object o) {
        return (o instanceof Point && getX() == ((Point) o).getX());
    
    }
    

    【讨论】:

      【解决方案3】:

      只需遍历列表并测试每个元素。

      for (int i = 0; i < list.size(); i++) {
          if (list.get(i).getX() == someValue) { // Or use equals() if it actually returns an Object.
              // Found at index i. Break or return if necessary.
          }
      }
      

      很详细,是的,但可能直到带有Closures 的JDK7,没有其他标准方式。

      【讨论】:

        【解决方案4】:

        如果我希望能够根据一个特定的属性值从集合中提取对象,我通常只使用映射。我发现这比遍历列表更简洁。

        Map<String, Object> map = new HashMap<String, Object>();
        
        map.put(o1.getX(), o1);
        map.put(o2.getX(), o2);
        

        现在,如果我想要 x 值为“foo”的对象,只需

        Object desiredObject = map.get("foo");
        

        如果顺序很重要,请考虑使用 LinkedHashMap。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-09-18
          • 2011-06-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-26
          • 1970-01-01
          相关资源
          最近更新 更多