【问题标题】:Why Array.asList does not create empty list?为什么 Array.asList 不创建空列表?
【发布时间】:2019-07-10 02:14:42
【问题描述】:

为什么它不创建空列表?

 String fileContent = "";
List<String> wordsList = Arrays.asList(fileContent.trim().split("[\\s]+"));

当我使用时:

System.out.print(wordsList.size());

打印出来:

1

此列表中的第一位是什么? 当我想测试我的迭代器时,我遇到了这个问题。

我的测试:

@Test
    void checkIfWorksWhenNoWord() {
        String emptyString="";

        assertFalse(new WordIterator(emptyString).hasNext());
    }

我的班级:

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

public class WordIterator implements Iterator {

    int index;
    List<String> wordsList;

    public WordIterator(String fileContent) {
        this.wordsList = Arrays.asList(fileContent.trim().split("[\\s]+"));
    }

    public List<String> getWordsList() {
        return wordsList;
    }

    @Override
    public boolean hasNext() {
        return index < wordsList.size();
    }
    @Override
    public String next() {
        if(hasNext()){

            return wordsList.get(index++);
        }
        return null;
    }
}

【问题讨论】:

  • 'String fileContent = "";' -> 这不能被拆分,但仍然是一个字符串,所以你得到一个数组,其中元素是那个空字符串。
  • 空的String 仍然是Objectsplit 不会改变这一点。
  • 那么,我可以使用这个构造函数以某种方式为我的测试创建空列表吗?
  • 甚至陌生人:" ".split("[\\s]+") 给出一个空数组。请不要问我这与文档告诉我们的内容如何兼容:)
  • 我猜它是空的原因是“尾随空字符串将被丢弃”

标签: java list unit-testing testing iterator


【解决方案1】:

来自 Javadoc split:

此方法返回的数组包含此字符串的每个子字符串,这些子字符串由与给定表达式匹配的另一个子字符串终止或以字符串结尾终止。

因此,"".split("[\\s]+") 给出了Array(""),即包含单个空字符串的数组,因为空字符串是输入字符串的唯一以输入字符串结尾终止的子字符串。奇怪,但真实。

【讨论】:

  • 正确,但我认为更相关的文档行是this如果表达式与输入的任何部分都不匹配,则结果数组只有一个元素,即这个字符串.
  • @BasilBourque 是的,这是一个简单的“推论”,紧随其后的定义。如果表达式不匹配输入的任何部分,则 " 由与给定表达式匹配的另一个子字符串终止" 始终为 false,剩下的只是被 " 终止的子字符串到字符串的末尾”,这就是整个字符串。
猜你喜欢
  • 2020-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
  • 1970-01-01
  • 2017-12-03
  • 2018-10-12
相关资源
最近更新 更多