首先,感谢您抽出宝贵时间阅读本文。我对Android开发很新,并感谢我能得到的所有帮助。我会简短地说明一下。
我正在开发一个应用程序作为辅助项目,通过自动化主动滚动(滚动20面骰子,添加个人修改器和从最大到最小的排序)来加速我和我的朋友的d& d会话。一切都很顺利,直到我遇到一个我无法解决的挫败感。带有名称和免费字典的排序Arraylist的长度似乎总是为零,我找不到原因。代码发布在下面。
第一步是从输入中收集用户数据。输入就像这样(这解释了奇怪的ID)
//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);
}
}
}
这是listmanager类的代码
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之前,列表的长度似乎没有问题。
编辑:以下是get-methods
public List<String> getPlayerNames() {
return playerNames;
}
public List<Integer> getDexMod() {
return dexMod;
}
UPDATE:这是绑定到滚动按钮的代码:
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());
}
这给我带来以下
我还在线查看了滚动类的代码本身是否正常运行,确实如此。以下是经过多次运行后四个硬编码名称和值的结果:
[Aaron,Josh,Clide,Li]
{Aaron = 24,Clide = 20,Josh = 22,Li = 8}
sh-4.3 $ java -Xmx128M -Xms16M HelloWorld
[Josh,Li,Aaron,Clide]
{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
[Li,Aaron,Clide,Josh]
{Aaron = 19,Clide = 18,Josh = 18,Li = 21}
一切似乎都运行得很好,我只是不明白为什么返回列表的长度为零。
P.S。 getSize()方法的代码
public int getSize() {
return playerNames.size();
}
答案 0 :(得分:1)
好的,这可能是错误:请记住,在Java中,每个变量就像任何其他编译语言一样具有范围。现在你在for内部取消了playerName和playerDexMod并将它们追加到其中,直到现在一切都在检查中。当你退出for,但是那些变量就会死掉,而且我的意思是java垃圾收集器,因为它们超出范围,应该解除分配它们。现在listManager(我认为是一个ArrayList)找到了自己不再存在的对象,所以基本上是null。这只是一个空数组列表。如果您使用的listManager在类中被删除,请尝试去除类中的其他变量,这样它们就不会超出范围。告诉我这是否有帮助。