我有两个ArrayLists。我想重用第二个arraylist(temporaryArrayList)。请注意我的代码。希望你当然能理解我想让你知道的事情。
System.out.println(arrayListContainer.get(0).get(0));
代码给出了arrayListContainer的预期大小,但没有给出
的预期结果new ArrayAdapter
我怎样才能做到这一点。谢天谢地,我们会接受任何形式的回复或建议。
答案 0 :(得分:3)
您正在添加相同的对象并将其删除。
要将不同的临时列表添加到IntSequence
,您应该创建一个副本:
更改以下行:
arrayListContainer
为:
arrayListContainer.add(temporaryArrayList);
Thilo在下面的评论中建议的另一种选择是每次都创建一个新的ArrayList<String> copy = new ArrayList<>(temporaryArrayList)
arrayListContainer.add(copy);
,这样您就可以确保将不同的临时列表添加到{{ 1}}。
答案 1 :(得分:2)
添加时需要创建ArrayList的克隆,否则当您删除内容时,您正在删除刚刚添加的实际列表的内容。克隆它将添加ArrayList的副本而不是原始。
编辑:实际上 - 基于Thilo对另一个答案的评论 - 更好的解决方案是将临时ArrayList代码提取到方法并调用它:
public static void main(String[] args){
ArrayList<ArrayList<String>> arrayListContainer = new ArrayList<>();
String[] a = {"I","you","he"};
arrayListContainer.add(createArrayList(a));
String[] b = {"Bob","Rahim","Betty"};
arrayListContainer.add(createArrayList(b));
System.out.println(arrayListContainer.size());
System.out.println(arrayListContainer.get(0).get(0));
}
private static ArrayList<String> createArrayList(String[] arr) {
ArrayList<String> temporaryArrayList= new ArrayList<>();
for(String str : arr) {
temporaryArrayList.add(str);
}
return temporaryArrayList;
}
答案 2 :(得分:2)
其他答案是正确的。你正在重用你的第二个ArrayList
,而不是你想要的方式。
您需要了解(a)对象的引用,以及(b)ArrayList是一个对象,它是对其他对象的引用的容器。
让我们看一下代码执行过程中的状态。
首先实例化ArrayList
,默认为10个广告位。将保留对引用ArrayList
个对象的其他String
实例的引用。
ArrayList< ArrayList< String > > arrayListContainer = new ArrayList<>();
ArrayList< String > temporaryArrayList = new ArrayList<>() ;
实例化String
个对象,在第二个列表的插槽中添加对每个对象的引用。请记住,列表包含String
对象的引用,而不是对象本身。
temporaryArrayList.add( "I" ) ;
temporaryArrayList.add( "you" ) ;
temporaryArrayList.add( "he" ) ;
temporaryArrayList.add( "she" ) ;
temporaryArrayList.add( "we" ) ;
将第二个列表的引用添加到第一个列表的第一个插槽中。
arrayListContainer.add(temporaryArrayList) ;
通过调用String
删除代词clear()
对象的所有引用。那些String
对象实际上存在于内存中一段时间,因为它们没有被任何其他对象引用,因此成为垃圾收集的候选对象。所以我们在这个图中显示它们已经消失了,但实际上它们可能会在内存中浮动一段时间。
temporaryArrayList.clear() ;
实例化一些新的String
个对象。在第二个列表的插槽中引用每个引用。
temporaryArrayList.add( "Rahim" ) ;
temporaryArrayList.add( "jon" ) ;
temporaryArrayList.add( "don" ) ;
temporaryArrayList.add( "shaila" ) ;
这是您误解的地方。你显然想要保留代词并在它们旁边添加一些专有名称。但是第一个列表不包含对String
个对象的引用,它包含对ArrayList
个String
个对象的引用。因此,我们最终得到两个对同一ArrayList
对象的引用,该对象包含对正确名称字符串的引用。旧代词串可能会或可能不会在记忆中漂浮,但我们无法再接触它们,所以我们认为它们已经消失了。
arrayListContainer.add( temporaryArrayList ) ;
接下来,清除唯一的字符串列表。所以现在第一个ArrayList
持有对同一个现在为空的第二个ArrayList
的两个引用。
temporaryArrayList.clear() ;
最终得到一个包含两个元素的列表,其中每个元素都指向相同的空“temp”列表。
如果您想在第一个列表中累积字符串,请将第一个列表重新定义为ArrayList
String
而不是ArrayList<String>
。所以,而不是:
ArrayList< ArrayList< String > > arrayListContainer = new ArrayList<>() ;
ArrayList< String > temporaryArrayList = new ArrayList<>() ;
…
arrayListContainer.add( temporaryArrayList ) ;
...这样,将add
更改为addAll
:
ArrayList< String > arrayListContainer = new ArrayList<>() ;
ArrayList< String > temporaryArrayList = new ArrayList<>() ;
…
arrayListContainer.addAll( temporaryArrayList ) ; // Call `addAll` to add the elements of one collection to another collection.
提示:尽可能使用接口。
通常最好指定更多通用接口而不是具体类,这样您就可以更轻松地切换出具体类;所以你可以使用List
:List< List<String> >
。
List<List<String>> listContainer = new ArrayList<>();
答案 3 :(得分:1)
您无法以您想要的方式重复使用它。您的ArrayList<ArrayList<String>>
包含引用到对象(在本例中为对ArrayList<String>
的引用)。如果你说
arrayListContainer.add(temporaryArrayList);
以后,
arrayListContainer.add(temporaryArrayList);
如果不在temporaryArrayList
之间分配新值,则arrayListContainer
将对同一个对象进行两次引用。 temporaryArrayList
是对象的引用,即使对象的内容发生更改,它也不会更改(除非您将整个新对象重新分配给它)。
您需要创建一个新对象。
答案 4 :(得分:1)
在您的情况下,您不需要数组列表的数组列表,只需将其作为字符串数组的数组列表:
ArrayList<String[]> arrayContainer = new ArrayList<>();
完成添加字符串后,请调用:
arrayContainer.add(temporaryArrayList.toArray(new String[temporaryArrayList.size()]));
这样你就可以安全地重用临时数组列表。
答案 5 :(得分:1)
ArrayList<ArrayList<String>> arrayListContainer = new ArrayList<>();
ArrayList<String> temporaryArrayList = new ArrayList<>();
temporaryArrayList.add("I");
temporaryArrayList.add("you");
temporaryArrayList.add("he");
temporaryArrayList.add("she");
temporaryArrayList.add("we");
arrayListContainer.add(new ArrayList<>(temporaryArrayList));
temporaryArrayList.clear();
temporaryArrayList.add("Rahim");
temporaryArrayList.add("jon");
temporaryArrayList.add("don");
temporaryArrayList.add("shaila");
arrayListContainer.add(new ArrayList<>(temporaryArrayList));
temporaryArrayList.clear();
System.out.println(arrayListContainer.get(0).get(0));
这只是克隆对象的另一种自然方式:)