将两个不同对象的数组合并为一个数组/集合

时间:2014-08-28 14:44:12

标签: java arrays object

我正面临这个任务:

我有A班和B班。这两个班不同但差不多。 我需要以某种方式将它们合并为1个单个对象数组,以便稍后我可以在组合这两个类的列表中使用它们。

A类:

public class Followers {
    private String request_id;
    private String number_sender;
    private String state;

    public String getRequest_id() {
        return request_id;
    }

    public String getNumber_sender() {
        return number_sender;
    }

    public String getState() {
        return state;
    }
}

B组:

public class Following {
    private String name;
    private String state;
    private String request_id;

    public String getRequest_id() {
        return request_id;
    }

    public String getName() {
        return name;
    }

    public String getState() {
        return state;
    }
}

我已经尝试过这样做了下一步:

Object[] obj1 = (Object[]) followers;
Object[] obj2 = (Object[]) followings;

 Object[] completeArray = ArrayUtils.addAll(obj1, obj2);

其中关注者和关注者都是相应类的数组。然后在我的列表适配器中使用:

  if (values[currentItem] instanceof Followers) { BLA BLA BLA}

  else if (values[currentItem] instanceof Following) { BLA BLA BLA}

但我得到了这个例外:

  

引起:java.lang.ArrayStoreException:类型为json.objects.Following的source [0]无法存储在json.objects.Followers []

类型的目标数组中

将两个不同对象数组合并为一个数组的最佳方法是什么?

只是在它们之间实现相同的接口才能完成工作,然后它们基本上会在接口类型的数组中?

您还推荐其他什么方式?

4 个答案:

答案 0 :(得分:3)

试试这个

Object[] completeArray = new Object[0];
completeArray = ArrayUtils.addAll(completeArray, obj1);
completeArray = ArrayUtils.addAll(completeArray, obj2);

答案 1 :(得分:3)

如果你让两个类都实现了一个公共interface,你就可以操作它们的数组/列表,好像它们包含接口的实例一样。

public interface Follow {

    public String getRequest_id();

    public String getState();
}

public class Follower implements Follow {

    private String request_id;
    private String number_sender;
    private String state;

    public String getRequest_id() {
        return request_id;
    }

    public String getNumber_sender() {
        return number_sender;
    }

    public String getState() {
        return state;
    }
}

public class Following implements Follow {

    private String name;
    private String state;
    private String request_id;

    public String getRequest_id() {
        return request_id;
    }

    public String getName() {
        return name;
    }

    public String getState() {
        return state;
    }
}

public void test() {
    List<Follow> all = new ArrayList<>();

    all.add(new Following());
    all.add(new Follower());

    for ( Follow f : all ) {
        String id = f.getRequest_id();
        String state = f.getState();
    }

}

或者你可以把它们放在一个层次结构中:

public class Entity {
    private String request_id;
    private String state;

    public String getRequest_id() {
        return request_id;
    }

    public String getState() {
        return state;
    }
}

public class Follower extends Entity {

    private String number_sender;

    public String getNumber_sender() {
        return number_sender;
    }

}

public class Following extends Entity {

    private String name;

    public String getName() {
        return name;
    }

}

public void test() {
    List<Entity> all = new ArrayList<>();

    all.add(new Following());
    all.add(new Follower());

    for ( Entity f : all ) {
        String id = f.getRequest_id();
        String state = f.getState();
    }

}

或者你可以将额外的字段变成属性。

enum Attribute {

    Follows,
    Followed;
}

public static class Entity {

    private String request_id;
    private String state;
    EnumMap<Attribute, String> attributes = new EnumMap<>(Attribute.class);

    public String getRequest_id() {
        return request_id;
    }

    public String getState() {
        return state;
    }

    // Factory to make entities.
    static Entity make(Attribute attribute, String value) {
        Entity e = new Entity();
        e.attributes.put(attribute, value);
        return e;
    }
}

public void test() {
    List<Entity> all = new ArrayList<>();

    all.add(Entity.make(Attribute.Follows, "Fred"));
    all.add(Entity.make(Attribute.Followed, "Gill"));

    for (Entity f : all) {
        String id = f.getRequest_id();
        String state = f.getState();
    }

}

有无数种可能性。

答案 2 :(得分:0)

USE concat

var combined = obj1.concat(obj2); //合并两个数组

答案 3 :(得分:0)

试试这个。

  private Object[] appendObj(Object[] obj, Object newObj) {

    ArrayList<Object> temp = new ArrayList<Object>(Arrays.asList(obj));
    temp.add(newObj);
    return temp.toArray();

  }