我在尝试将数据存储在arraylists的arraylist中时遇到了问题。我一直在用不同的方法来处理如何处理事情,到目前为止,我已经想到了这一切。无论我尝试什么,它都会用第二个列表覆盖第一个列表,并将第二个列表放在应该是的位置。
数组列表将包含从sql db中提取的任务信息列表,一次一行。因为我希望它在高度上是动态的,因为我不知道在任何给定时间将有多少任务,我有这样的列表设置:
public static ArrayList<ArrayList<String>> listofquests = new ArrayList<ArrayList<String>>();
public static ArrayList<String> questbloat = new ArrayList<String>();
当它开始时,它会通过表格找出有多少任务,并保存该数字。然后它会使列表空白,如下所示:
for(int j = 0; j < 37; j++){
questbloat.add(" ");
}
for(int i = 0; i< questcount; i++){
listofquests.add(questbloat);
}
从那里我可以获取任务数据并将其存储到列表列表中 (为了节省空间,我将截断它,一个pastebin将在底部)
for(int i = 0; i < questcount ; i++){
rs = UserVerify.stmt.executeQuery("SELECT Started, Complete, Title, MinLevel, MaxLevel, Solo, Timer, TimeLeft, MobName, MobAmount, MobKilled, Collect1, Amount1, Left1, Collect2, Amount2, Left2, Collect3, Amount3, Left3, Collect4, Amount4, Left4, Collect5, Amount5, Left5, Collect6, Amount6, Left6, Gold, XP, Item1, Item2, Item3, Item4, Item5, Item6 FROM Quests_" + Game.Playername + " WHERE QuestID = " + i);
while(rs.next()){
Startedint = rs.getInt("Started");
Completeint = rs.getInt("Complete");
Title = rs.getString("Title");
MinLevelint = rs.getInt("MinLevel");//
MaxLevelint = rs.getInt("MaxLevel");//
Soloint = rs.getInt("Solo");//
Timerint = rs.getInt("Timer");//
TimeLeftint = rs.getInt("TimeLeft");//
它会提取其余的rs数据,并根据需要将int转换为字符串:
Started = Integer.toString(Startedint);
Complete = Integer.toString(Completeint);
MinLevel = Integer.toString(MinLevelint);
MaxLevel = Integer.toString(MaxLevelint);
然后它开始将它存储到列表列表中:
listofquests.get(i).set(0, Started);
listofquests.get(i).set(1, Complete);
listofquests.get(i).set(2, Title);
listofquests.get(i).set(3, MinLevel);
listofquests.get(i).set(4, MaxLevel);
listofquests.get(i).set(5, Solo);
listofquests.get(i).set(6, Timer);
如果我这样做它只需要添加一个任务,我就得到这个
[[1, 0, Ninja Slayer, 1, 100, 1, 0, 0, NinjaBot, 10, 0, a, 1, 0, a, 1, 0, a, 1, 0, a, 1, 0, a, 1, 0, a, 1, 0, 127, 11, a, a, a, a, a, a]]
但是当我让它看到两个任务时,我得到了这个
[[0, 0, Ninja Boss, 5, 100, 1, 0, 0, NinjaBotBoss, 1, 0, a, 1, 0, a, 1, 0, a, 1, 0, a, 1, 1, a, 1, 1, a, 1, 0, 127, 55, a, a, a, a, a, a], [0, 0, Ninja Boss, 5, 100, 1, 0, 0, NinjaBotBoss, 1, 0, a, 1, 0, a, 1, 0, a, 1, 0, a, 1, 1, a, 1, 1, a, 1, 0, 127, 55, a, a, a, a, a, a]]
由于某种原因,它会回到第一行,填充它,然后填写第二行。 起初我虽然好,我的.get(i).set(x,value);是错的,我需要切换i和x,但这给了我空列表......所以我不知所措。
这是全班。在开始附近有一堆其他的sql东西用于其他东西 http://pastebin.com/TAHQrAiw
我完全迷失在这里,所以任何帮助都会非常感激。提前谢谢。
答案 0 :(得分:2)
您需要复制questsbloat
列表。通过重复使用相同的引用,您实际上在列表列表的每一行中存储相同的任务列表
for(int i = 0; i< questcount; i++){
listofquests.add(new ArrayList<String>(questbloat));
}