java数组包含对象

时间:2014-12-23 18:56:39

标签: java indexof

我有

String selectedName = "ABC";
List<object> pgetName; 

其中object包含 id,name,version

等变量

我想做相同的

int first = pgetName.indexOf(selectedName);
int last = pgetName.lastIndexOf(selectedName);

用于简单的String Arrays。我试过了

int first = pgetName.getProperty("name").indexOf(processToStart);

int first = pgetName[].getName().indexOf(processToStart);
例如,但他们不能工作。我该怎么做我想做的事?这是一个先进的Java,对我来说是一个菜鸟......

提前致谢,

3 个答案:

答案 0 :(得分:1)

这是另一种方法(可能有点矫枉过正,但它会向您展示另一种方式)。我们的想法是覆盖indexOf和lastIndexOf方法,以便根据您的字段进行验证&#34; name&#34;:

    private static class TestObject {

    String id, name, version;

    public TestObject(String id, String name, String version) {
        super();
        this.id = id;
        this.name = name;
        this.version = version;
    }

    public String getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getVersion() {
        return version;
    }
}

public static void main(String[] args) {

    List<TestObject> pgetName = new ArrayList<TestObject>() {
        @Override
        public int indexOf(Object o) {
            if (o == null || this.isEmpty()) {
                return -1;
            }
            int counter=0;
            for (TestObject current : this) {
                if (o.equals(current.getName())) {
                    return counter;
                }
                counter++;
            }
            return -1;
        }

        @Override
        public int lastIndexOf(Object o) {
            if (o == null || this.isEmpty()) {
                return -1;
            }
            for (int i=this.size()-1; i>=0;i--) {
                TestObject current = get(i);
                if (o.equals(current.getName())) {
                    return i;
                }
            }
            return -1;
        }
    };
    pgetName.add(new TestObject("1", "name1", "ver1"));
    pgetName.add(new TestObject("2", "name2", "ver2"));
    pgetName.add(new TestObject("3", "name3", "ver3"));
    pgetName.add(new TestObject("4", "name1", "ver4"));
    int first = pgetName.indexOf("name1");
    int last = pgetName.lastIndexOf("name1");
    System.out.println("First: " + first + " - Last: " + last);

}

结果是:

First: 0 - Last: 3

答案 1 :(得分:1)

对于任何Java对象,您可以覆盖方法equals和hashCode(这不是真正使用的,但实现两种方法通常都是一种很好的做法),以便使用java.util.List的indexOf和lastIndexOf函数。 / p>

eclipse的上下文菜单生成两种方法的默认实现,让您选择应该在哪个字段进行比较。试一试。

执行上述方法后,可以在List上使用indexOf。

答案 2 :(得分:1)

如果我理解你的问题,你想要找到一个Object的索引,其中一个Object的属性是一个特定的值&#34;。

这在Java(或大多数语言FWIW)中是不可能的。你可以通过for循环很简单地实现它,但是:

public MyObject findObjectByName(MyObject[] objects, String name) {
    for (MyObject object: objects) {
       if (object.name.equal(name) {
          return object;
       }
    }

    return null;
}

如果要查找索引,可以执行类似的操作:

public int  findObjectIndex(MyObject[] objects, String name) {
    for (int i = 0; i < objects.length; ++i)
       if (objects[i].name.equal(name) {
          return i;
       }
    }

    return -1;
}

现在,这是您可以采取的最天真的方法,并且通常(但并非总是)是最好的方法。如果你有大量的对象,并且你需要按名称查找很多,那么最好建立一次索引,然后通过索引查找它们:

public class MyObjectIndex {
   final Map<String, MyObject> byName = new HashMap<String, MyObject>();
   public MyObjectIndex(MyObject[] objects) {
       for (MyObject object: objects) {
          byName.put(object.getName(), object);
       }
   }

   public getMyObjectWithName(String name) {
       return byName.get(name);
   }
}