gpt4 book ai didi

java - 为什么 for 循环生成的数组列表的长度始终为零(Java)?

转载 作者:行者123 更新时间:2023-11-30 00:37:32 24 4
gpt4 key购买 nike

首先,感谢您抽出宝贵的时间阅读本文。我是 android 开发的新手,感谢我能得到的所有帮助。我会保持简短的描述。

我正在开发一个应用程序作为一个副项目,通过自动化主动掷骰(掷 20 面骰子,添加个人修饰符并从大到小排序)来加快我和我 friend 的 d&d session 。一切都很顺利,直到我遇到一个错误,令我沮丧的是我无法修复。带名称的已排序 Arraylist 的长度和免费字典的长度似乎始终为零,我无法找出原因。代码贴在下面。

第一步是从输入中收集用户数据。输入是这样的(这解释了奇怪的 ID)

enter image description here

//updates player database with user input
private void updateDictionaryManager(int _partySize) {
listManager.empty();

if (_partySize > 0) {
for (int i = 0; i < _partySize + 1; i++) {
EditText Name = (EditText)findViewById(i);
EditText dexMod = (EditText)findViewById(i + 10);
String playerName = "player " + String.valueOf(i);
int playerDexMod = 0;

if (Name.getText() != null) {
playerName = Name.getText().toString();
}

if (dexMod.getText() != null) {
try {
playerDexMod = Integer.parseInt(dexMod.getText().toString());
} catch (Exception e) {
playerDexMod = 0;
}
}
listManager.append(playerName, playerDexMod, i);
}
}
}

这是列表管理器类的代码

public void append(String _name, int _dexMod, int _playerNumber) {
if (!_name.equals("")) {
playerNames.add(_name);
} else {
String defaultName = "player " + String.valueOf(_playerNumber);
playerNames.add(defaultName);
}
dexMod.add(_dexMod);
}

public void empty() {
playerNames.clear();
dexMod.clear();
}

我想问题就藏在这里(但我发送了前面的以防万一我错过了那里的东西)

final class InitiativeRoller extends ListManager{
Map<Integer, List<String>> playerRolls = new HashMap<>();
Map<String, Integer> outputDictionary = new HashMap<>();

List<Integer> alreadyRolled = new ArrayList<>();
List<String> outputOrder = new ArrayList<>();

public void roll() {
//retrieve lists from manager
List<String> _names = getPlayerNames();
List<Integer> _dexMod = getDexMod();

//rolling the dice and saving values
for (int i = 0; i < getSize(); i++) {
int _roll = (int) Math.round(Math.random() * 19) + 1 + _dexMod.get(i);

if (alreadyRolled.contains(_roll)) {
//add name to list in dictionary with corresponding roll
playerRolls.get(_roll).add(_names.get(i));
} else {
//generate new list for players with this roll and add to playerRolls
List<String> _list = new ArrayList<>();
_list.add(_names.get(i));
playerRolls.put(_roll, _list);

alreadyRolled.add(_roll);
}
}

//sorting the rolls from largest to smallest
Collections.sort(alreadyRolled);
Collections.reverse(alreadyRolled);

//generating output dictionary
for (int i = 0; i < alreadyRolled.size(); i++) {
int _roll = alreadyRolled.get(i);
List<String> list = playerRolls.get(_roll);

//shuffling order of players with the same roll
Collections.shuffle(list);

//add to output dictionary and list
for (int x = 0; x < list.size(); x++) {
outputDictionary.put(list.get(x), _roll);
outputOrder.add(list.get(x));
}
}
}

public Map<String, Integer> getOutputDictionary() {
return outputDictionary;
}

public List<String> getOutputOrder() {
return outputOrder;
}

每次检查时,生成的 outputDictionary 和 outputorder 的长度都为零。我错过了什么?抱歉发了这么长的帖子。

编辑:我检查了代码,在 InitiativeRollerClass 中调用 getPlayerNames 和 getDexMod 之前,列表的长度似乎没有问题。

编辑:这是获取方法

public List<String> getPlayerNames() {
return playerNames;
}

public List<Integer> getDexMod() {
return dexMod;
}

更新:这是绑定(bind)到滚动按钮的代码:

rollInitiative.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//update dictionary
int roundedProgress = Math.round(playerSlider.getProgress());

try {
updateDictionaryManager(roundedProgress);
} catch (Exception e) {
updateDictionaryManagerOnException(roundedProgress, playerList);
}

initiativeRoller.roll();
displayResult(initiativeRoller.getOutputOrder(), initiativeRoller.getOutputDictionary(), InitiativeList);
}
});

这里介绍方法,仅供调试

//displays output to user
private void displayResult(List<String> _outputOrder, Map<String, Integer> _outputDictionary, TextView _initiativelist) {
_initiativelist.setText(listManager.getDexMod() + "\n" + listManager.getPlayerNames()
+ "\n" + initiativeRoller.getOutputOrder());
}

这给我带来了以下内容

enter image description here

我还在线检查了 roll 类的代码本身是否正常运行,确实如此。这是多次运行后四个硬编码名称和值的结果:

[亚伦、乔希、克莱德、李]
{Aaron=24,Clide=20,Josh=22,Li=8}
sh-4.3$ java -Xmx128M -Xms16M HelloWorld
[乔希、李、亚伦、克莱德]
{Aaron=6,Clide=6,Josh=20,Li=12}
sh-4.3$ java -Xmx128M -Xms16M HelloWorld
[Aaron, Clide, Li, Josh]
{Aaron=20,Clide=17,Josh=10,Li=11}
sh-4.3$ java -Xmx128M -Xms16M HelloWorld
[李、亚伦、克莱德、乔希]
{Aaron=19,Clide=18,Josh=18,Li=21}

似乎一切正常,我只是不明白为什么返回的列表长度为零。

附注getSize() 方法的代码

public int getSize() {
return playerNames.size();
}

最佳答案

好的,这可能是错误的:请记住,在 Java 中,每个变量就像任何其他编译语言一样都有一个范围。现在你在 for 中声明了 playerName 和 playerDexMod,然后将它们附加到 for 中,直到现在一切都在检查中。但是,当您退出 for 时,这些变量就死了,我的意思是 java 垃圾收集器,因为它们超出了范围,应该释放它们。现在 listManager(我想它是一个 ArrayList)发现自己有不再存在的对象,所以基本上是空的。那只是一个空数组列表。如果您使用的 listManager 在类中被清除,请尝试清除类中的其他变量,这样它们就不会超出范围。告诉我这是否有帮助。

关于java - 为什么 for 循环生成的数组列表的长度始终为零(Java)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43168712/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com