为什么for循环生成的arraylist的长度始终为零(Java)?

时间:2017-04-02 13:09:11

标签: java android arraylist

首先,感谢您抽出宝贵时间阅读本文。我对Android开发很新,并感谢我能得到的所有帮助。我会简短地说明一下。

我正在开发一个应用程序作为辅助项目,通过自动化主动滚动(滚动20面骰子,添加个人修改器和从最大到最小的排序)来加速我和我的朋友的d& d会话。一切都很顺利,直到我遇到一个我无法解决的挫败感。带有名称和免费字典的排序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);
        }
    }
}

这是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());
    }

这给我带来以下

enter image description here

我还在线查看了滚动类的代码本身是否正常运行,确实如此。以下是经过多次运行后四个硬编码名称和值的结果:

[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();
}

1 个答案:

答案 0 :(得分:1)

好的,这可能是错误:请记住,在Java中,每个变量就像任何其他编译语言一样具有范围。现在你在for内部取消了playerName和playerDexMod并将它们追加到其中,直到现在一切都在检查中。当你退出for,但是那些变量就会死掉,而且我的意思是java垃圾收集器,因为它们超出范围,应该解除分配它们。现在listManager(我认为是一个ArrayList)找到了自己不再存在的对象,所以基本上是null。这只是一个空数组列表。如果您使用的listManager在类中被删除,请尝试去除类中的其他变量,这样它们就不会超出范围。告诉我这是否有帮助。