【问题标题】:To remove null values while traversing arraylist在遍历 arraylist 时删除空值
【发布时间】:2018-02-10 03:35:16
【问题描述】:

我正在尝试使用此代码替换 arraylist 中的空值。我在我的 xml 文件的标记中获取空值。该标签中的值来自arraylist。我想从标签中删除 null 并且什么都没有代替它。我的代码是这样的:

    for(String s:a.getList){
here I setting values in tag by create tag and than appending child nodess using DOM parser.
}

其中 a=包含列表的对象

输出是这样的:

    <value>1</value>
<value>2</value>
<value>null</value>
<value>3</value>
<value>4</value>
<value>null</null>

。 . .等等

预期输出:

    <value>1</value>
<value>2</value>
<value/>
<value>3</value>
<value>4</value>
<value/>

null 应该被移除并且标签应该看起来像这样

我正在尝试的代码是:

  for(String s:a.list){
if(s.equals("null")){
s.replace("null","");
my code;

}

总是得到空指针异常,不知道这是否运行会输出什么。 请帮忙..

【问题讨论】:

  • 如果您只检查值即 (1,2,null..),请尝试此条件 if(null==s ||s.equals("null"))
  • 已经用这两个...不工作
  • 你能把插入代码和错误贴在这里
  • if 条件下出现空指针异常
  • 您正在“更新”不可变的String...您需要更改列表,因此更改当前索引处的值(需要更改循环)

标签: java


【解决方案1】:

您没有更新列表,您正在创建一个新的String 实例,因为String 是不可变的。如果当前值为"null"就设置你想要的值

for(int i = 0; i < list.size(); ++i){
     if("null".equals(list.get(i)){
         list.set(i, "");
     }
}

null 值的条件不会失败,但如果要替换它们,则需要添加条件,因为目前它只会更新 "null"

【讨论】:

  • 由于ListIterator#set(E),这是ListIterator 的一个很好的用例。
  • @Izruo 确实,我没有使用它(在我的脑海中,迭代器总是只读的)!如果您愿意,欢迎您发布它有答案!
【解决方案2】:

为了更清楚

public static void main(String... args) {
    ArrayList<String> a = new ArrayList<String>();
    a.add("one");
    a.add(null);
    a.add("two");
    a.removeAll(Collections.singleton(null));
    for(String value : a) {
        System.out.println(value);
    }
}

输出

one
two

【讨论】:

  • "为了更好地理解" ?
  • 希望我的 java 比我的英语好
  • removeAll 很好,但它会成为一个问题,因为 OP 想要删除"null",如果它们变成"NULL",不确定你可以removeAllIgnoreCase(不是sur 有一个等价物λ)
  • 我的意思是:“没有解释”......你需要解释你做了什么
  • 他说“看到了这个问题并尝试了它..得到同样的例外”所以我想向他展示一个工作示例....我认为原始问题中的解释已经足够好了
【解决方案3】:

如果您想同时删除,使用数组列表的最佳方法是从最后一个迭代到第一个。

for (int i = list.size()-1; i >= 0; i--) {
        if ("null".equalsIgnoreCase(list.get(i))) {
            list.remove(i);
        }
    }

"null".equalsIgnoreCase(list.get(i)) 将避免空指针异常

用于删除和打印值

for (String str  :  abc) {
        if ("null".equalsIgnoreCase(str)) {
            System.out.println("<value/>");
        } else {
            System.out.println("<value>"+str+"</value>");
        }
    }

【讨论】:

  • 不幸的是,它仍在预期的输出中打印一个 XML 节点。
  • @AxelH 你能给我一个arraylist值的样本吗?你期望的输出是什么。希望您的数组列表中的 null 以字符串形式出现。我的意思是“空”而不是空。如果它不是字符串,那么您必须使用 null == lis.get (i) 来删除条件
  • 检查 OP 问题...他正在以 XML 格式的值打印他的列表。 (假设它在节点中添加列表的内容。但是 null 应该输出 &lt;value /&gt; 而不是简单地删除它。
  • @AxelH 我更专注于同时从数组列表中删除空字符串。如果您想要上面提到的类似内容,我认为我的回答的第二部分会对您有所帮助
  • 我什么都不要...检查名字 ;)
猜你喜欢
  • 2013-03-02
  • 2015-01-19
  • 1970-01-01
  • 1970-01-01
  • 2015-11-16
  • 2013-03-21
  • 1970-01-01
  • 2015-11-28
  • 2019-11-10
相关资源
最近更新 更多