Jay Lee
Jay Lee

Reputation: 23

Find specific object in an arraylist

Currently have an issue getting a specific object in an arraylist. So I have multiple classes that implements the same interface, and I create objects of the different classes. The problem is that I don't know how to differentiate the classes in the arraylist.

ArrayList<Interface> arraylist = new ArrayList<>();

public static void main(String[] args) {

    addInterface(new interfaceA());
    addInterface(new interfaceB());
    addInterface(new interfaceC());

}

public static void addInterface(Interface foo) {
    arraylist.add(foo);
}

Let say that I want to get interfaceA(), I could call it by arraylist.get(0) but I don't want to hardcode it. Each class has the same methods but the code is different.

Upvotes: 1

Views: 101

Answers (3)

OldCurmudgeon
OldCurmudgeon

Reputation: 65803

I would use a Map instead of a List. In this case an IdentityHashMap is a good fit.

interface Thing {

}

IdentityHashMap<Class<? extends Thing>, Thing> things = new IdentityHashMap<>();

class ThingA implements Thing {
    @Override
    public String toString() {
        return "ThingA{}";
    }
}

class ThingB implements Thing {
    @Override
    public String toString() {
        return "ThingB{}";
    }
}

class ThingC implements Thing {
    @Override
    public String toString() {
        return "ThingC{}";
    }
}

public void registerThing(Thing thing) {
    things.put(thing.getClass(), thing);
}

public void test(String[] args) {
    registerThing(new ThingA());
    registerThing(new ThingB());
    registerThing(new ThingC());

    System.out.println(things.get(ThingB.class));
}

Upvotes: 2

Arya
Arya

Reputation: 91

    public Interface getInterfaceA(List<Interface> interfaces) {
    for (Interface i : interfaces) {
        if (i instanceof InterfaceA)
            return i;
    }
    return null;
    }

Upvotes: 0

ernest_k
ernest_k

Reputation: 45309

You could filter using a predicate, by checking runtime classes:

List<Interface> interfaceAList = arraylist.stream()
                         .filter(e -> InterfaceA.class.isInstance(e))
                         .collect(Collectors.toList());

Upvotes: 2

Related Questions