【问题标题】:For each loop won't add ArrayList String to ArrayList<ArrayList<String>>对于每个循环都不会将 ArrayList String 添加到 ArrayList<ArrayList<String>>
【发布时间】:2015-06-05 16:34:20
【问题描述】:

我创建了一个For Each 循环,在其中完成工作,然后将其添加到String ArrayList var_CaramelChoc,每次迭代都添加到ArrayList&lt;ArrayList&lt;String&gt;&gt; numStuff

但是当功能完成时。这些结果不会显示为已添加到 ArrayList&lt;ArrayList&lt;String&gt;&gt; numStuff(而是显示为空)。

如何修复我的代码,以便将在 forEach 循环内的 String ArrayList var_CaramelChoc 内完成的工作添加到 ArrayList&lt;ArrayList&lt;String&gt;&gt; numStuff 中?

要明确ArrayLists 添加到numStuff 并不是没有值。问题是ArrayList&lt;ArrayList&lt;String&gt;&gt; numStuff 本身,完全是空的(当前没有添加任何 ArrayList)。

代码如下:

 private ArrayList<ArrayList<String>> hasStuff(String line) {
        ArrayList<ArrayList<String>> numStuff = new ArrayList<>();
    for (String caramelChoc : CaramelChoc) {
        ArrayList<String> var_CaramelChoc = new ArrayList<>();
        if ((line.contains(caramelChoc.toLowerCase() + " ") || line.contains(caramelChoc + " ")) && line.contains(";")) {
            String mainString = line.toLowerCase();

            if (!(mainString.contains(","))) {
                var_CaramelChoc.add((line).replace(";", ""));
            } else {
                    ...
            }
        }
        numStuff.add(new ArrayList<>(var_CaramelChoc));
        }
  return numStuff;
    }

我预期会发生什么,除非我弄错了。在每次迭代中,一个arrayList 将被添加到ArrayList&lt;ArrayList&lt;String&gt;&gt; numStuff 即使下面的条件不满足(在任何一种情况下,虽然添加的arrayList 可能是空的。一个空的arrayList,仍然存在在 numStuff 中)。但目前情况并非如此。

if ((line.contains(caramelChoc.toLowerCase() + " ") || line.contains(caramelChoc + " ")) && line.contains(";")) {

【问题讨论】:

  • CaramelChoc,我们不知道它来自哪里,很可能是空的。
  • 什么是“焦糖巧克力”?似乎您的问题出在 if 上,您可以通过打印 linecaramelChoc 包含的内容来调试代码吗?
  • 你确定第一个 IF 在某个时候匹配吗?因为如果条件从未满足,它只会添加空的 var_CaramelChoc arraysLists
  • 正如@Jean 所建议的,检查您的CaramelChoc 是否为空。这意味着您不进入循环本身,numStuff 将为空。
  • 是的,我已经调试并检查过了,因此我在上面进行了详细解释。关于其他 cmets,请阅读下面代码的最后一段,因为这充分解释了即使不满足条件,也应该添加一个空数组列表,但它不是

标签: java android android-activity arraylist foreach


【解决方案1】:

嗯,这看起来并不像 java 风格。 首先,for (String caramelChoc : **CaramelChoc**) 不应该用大写来声明,它应该是caramelChoc

变量命名约定是简单的驼峰命名法。因此,var_CaramelChoc 应替换为 caramelChocks

根据您的代码,您不需要ArrayList&lt;ArrayList&lt;String&gt;&gt;。您的 var_CaramelChoc 将始终只包含一个值,因为未定义循环以添加多个值。所以,它可以简化为ArrayList&lt;String&gt;,看起来像numStuff.add(line.replaceAll(";","");

ArrayList 进行简化后,您的代码将变得更具可读性。我还建议添加logging,如果CaramelChoc,它将记录当前输入参数和当前大小

【讨论】:

  • 虽然我的编码风格中的 cmets 在其他设置中可能会有所帮助。你上面的说法,根本解决不了手头的问题。
【解决方案2】:

当您在循环中创建 ArrayList&lt;String&gt; var_CaramelChoc = new ArrayList&lt;&gt;(); 时,您在 numStuff 处得到了空 [[], []],并且最后添加了空列表。仅当您要添加任何元素时才初始化列表,或者仅当列表不为空时才添加。

缺陷在于您的 if ((line.contains(caramelChoc.toLowerCase() + " ") || line.contains(caramelChoc + " ")) &amp;&amp; line.contains(";")) 语句。检查 Eclipse 调试器失败/通过条件的位置。

有什么测试用例吗?

【讨论】:

  • 正如我上面所解释的,无论 if 语句是否返回 true。应该添加一个空的数组列表。但目前并非如此。这是我的问题
【解决方案3】:

尝试以下方法以更好地调试,看看会发生什么

private ArrayList<ArrayList<String>> hasStuff(String line) {

    ArrayList<ArrayList<String>> numStuff = new ArrayList<>();

    for (String caramelChoc : CaramelChoc) {
        ArrayList<String> var_CaramelChoc = new ArrayList<>();

        if ((line.contains(caramelChoc.toLowerCase() + " ") || line.contains(caramelChoc + " ")) && line.contains(";")) {
            String mainString = line.toLowerCase();

            var_CaramelChoc.add("FIRST IF") ;

            if (!(mainString.contains(","))) {
                var_CaramelChoc.add((line).replace(";", ""));
            } else {
                    ...
            }
        }
        else
        {
            var_CaramelChoc.add("FIRST ELSE") ;
        }
        numStuff.add(new ArrayList<>(var_CaramelChoc));
     }
     return numStuff;
 }

【讨论】:

  • 虽然我很高兴有人建议了代码修复。它不能解决任何问题。在任何一种情况下,numStuff.add(new ArrayList(var_CaramelChoc)); 仍然放置在每个 forEach 的末尾之前。它已经在哪里,所以会产生相同的结果。 (其中无论要添加的arrayList是否为空,都没有添加到numStuff中。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
  • 2019-11-28
  • 1970-01-01
  • 2014-07-31
  • 1970-01-01
  • 1970-01-01
  • 2013-07-29
相关资源
最近更新 更多