java处理arraylist的arraylist,每个arraylist都有不同的对象

thtygnil  于 2021-06-30  发布在  Java
关注(0)|答案(4)|浏览(436)

关闭。这个问题需要细节或清晰。它目前不接受答案。
**想改进这个问题吗?**通过编辑这个帖子来添加细节并澄清问题。

27天前关门了。
改进这个问题
我有三个不同的数组列表:

ArrayList<type1> alista = new ArrayList<>();
ArrayList<type2> blistb = new ArrayList<>();
ArrayList<type3> clistc = new ArrayList<>();

然后我创建一个新的数组列表并将这3个数组列表放入其中:

ArrayList<Object> all_lists = new ArrayList<Object>();
all_lists.add(alista);
all_lists.add(blistb);
all_lists.add(clistc);

如何添加或删除所有列表中的对象:alista、blistb和clistc?我想在main()中的方法之间来回传递所有的\u列表。我知道这样做可能是错误的,但我想在我把它做得更好之前让它工作。
例如,如何从blistb中取出,然后添加一个我创建的type2类型,然后删除一个type2(从blistb中)。然后把它放回(或者创建新的所有列表?)?

luaexgnf

luaexgnf1#

您只需跟踪哪个数组是哪个:在:

ArrayList<Object> all_lists = new ArrayList<Object>();
all_lists.add(alista);
all_lists.add(blistb);
all_lists.add(clistc);
``` `all_lists.get(0)` 是
alista `all_lists.get(1)` 是
blistb `all_lists.get(2)` 是 `clistc` 从中删除对象 `blistb` 通过知道它在该列表中的哪个索引并像平常一样删除它。

all_lists.get(1).remove(2);

vktxenjb

vktxenjb2#

all_lists 应声明为 ArrayList<ArrayList> (使用原始类型,需要 @SuppressWarnings("unchecked") ).

@SuppressWarnings("unchecked")
ArrayList<ArrayList> all_lists = new ArrayList<>();
all_lists.add(alista);
all_lists.add(blistb);
all_lists.add(clistc);

clistc.add(new type3());

all_lists.get(0).add(new type1()); // add type1 object to alista
all_lists.get(1).add(new type2()); // add type2 object to blistb
all_lists.get(2).remove(0); // remove the 1st element of clistc

然而,创建一个 Package 类而不是 all_list :

class ListWrapper {
    private List<type1> aListA;
    private List<type2> bListB;
    private List<type3> cListC;
// constructor(s), getters/setters

    public void addType1(type1 t1) {
        aListA.add(t1);
    }
// etc.
}
xj3cbfub

xj3cbfub3#

你应该申报 all_lists 作为一个 ListList s;然后,您可以直接向 List 在特定的索引处。

List<List> all_lists = new ArrayList<>();
all_lists.add(new ArrayList<A>(Arrays.asList(new A(1), new A(2), new A(3))));
all_lists.add(new ArrayList<B>(Arrays.asList(new B(4), new B(5))));
all_lists.add(new ArrayList<C>(Arrays.asList(new C(6))));
all_lists.get(1).add(new B(3));//add element to B List
eqzww0vc

eqzww0vc4#

如果我理解正确,您希望能够传递所有数据并对列表进行更改。首先,我要将列表的类型更改为list接口。这不会影响代码的功能,但如果您希望在将来更改列表实现,它会更容易,并且还可以保存一些字符:

List<Type1> alista = new ArrayList<>();
List<Type2> blistb = new ArrayList<>();
List<Type3> clistc = new ArrayList<>();

我们将对所有\u列表执行相同的操作,同时将其泛型类型更改为list,以使以后的工作更轻松:

List<List<Object>> allLists = new ArrayList<Object>();

(如果type1、type2和type3有一些共同的祖先,它们都是从这些祖先扩展而来的,请将上面的对象更改为该类型。)
要获取一个列表,例如blistb,您需要知道它在所有列表中的位置:

List<Type2> blistbReference = allLists.get(1); // Index starts from 0

这可能很难维护和跟踪。还有一种风险是,将来的一些代码会改变顺序,这将导致错误和麻烦。
处理列表的更好方法是将它们 Package 在数据对象中:

public class AllLists {
    private List<Type1> alista;
    private List<Type2> blistb;
    private List<Type3> clistc;

    public AllLists(List<Type1> alista, List<Type2> blistb, List<Type3> clistc) {
        this.alista = alista;
        this.blistb = blistb;
        this.clistc = clistc;
    }

    public List<Type1> getAlista() {
        return alista;
    }

    public List<Type1> getBlistb() {
        return blistb;
    }

    public List<Type1> getClistc() {
        return clistc;
    }
}
// ......

    AllLists allLists = new AllLists(alista, blistb, clistc);

现在,您可以从alllists对象轻松获取列表,并根据需要修改它们。

Type2 t = new Type2;
allLists.getBlistb().add(t);

您不需要“把列表放回去”,因为java是通过引用传递的。当您从alllists获取blistb时,您将获得对同一list对象的引用。对引用的任何更改都是对原始列表的更改。
我改变了类型和变量名,使之更加标准化。

相关问题