【问题标题】:How to remove and set from List<String> in java?如何从 java 中的 List<String> 中删除和设置?
【发布时间】:2014-06-01 02:47:43
【问题描述】:

在java中我有这个功能:

public List<String> seperatekeys(String text) {
    String[] keys = text.split("and");
    List<String> words = Arrays.asList(keys);

    ListIterator<String> iter = words.listIterator();
    while (iter.hasNext()) {
        String currentWord = iter.next().trim();
        if (currentWord.equals("")) {
            iter.remove();
        } else {
            iter.set(currentWord);
        }
    }

    return words;
}

但是当我执行 remove() 时,它会崩溃并提示 unsupportedoperationerror。

有人知道怎么解决吗?

谢谢

【问题讨论】:

  • Arrays.asList() 返回一个无法修改的List(在运行时)
  • 你为什么不试试 currentword.equals(null);
  • @shekhar:这有什么帮助?
  • @shekhar 如果您注意到,错误是与remove()。我看不出与null 相比如何解决这个问题。
  • 创建一个空的ArrayList,直接遍历数组,添加你想保留的元素

标签: java list loops


【解决方案1】:

问题在于Arrays#asList() 返回一个从AbstractList 继承remove()ArrayList 实现。 AbstractListremove()的实现是这样的:

public E remove(int index) {
    throw new UnsupportedOperationException();
}

并且因为迭代器使用列表的迭代器来执行其remove() 方法,所以您最终会遇到异常。

这里有一些解决方案。您可以将Arrays#asList() 的结果传递给ArrayList 构造函数:

List<String> words = new ArrayList<>(Arrays.asList(keys));

现在,您可以遍历生成的 List 并删除所需的元素。

或者,正如MadProgrammer 所说,您可以采取相反的方法并遍历数组并添加您想要保留的元素:

List<String> words = new ArrayList<>();
for (String s : keys) {
    String currentWord = s.trim();
    if (!currentWord.equals("")) {
        words.add(currentWord);
    }
}

【讨论】:

  • 应该是new ArrayList 而不是new ArrayList&lt;&gt;
  • @user3580294-不错的答案!
  • @Unihedron 否。前者是原始类型,应尽可能避免使用。后者是通用的,并且在大多数情况下是类型安全的。
  • 您直接将其分配给List&lt;String&gt;。原始类型推断为&lt;String&gt;
  • @Unihedron 在处理原始类型时不会进行推理,因为根本不执行通用检查。
猜你喜欢
  • 1970-01-01
  • 2014-07-20
  • 1970-01-01
  • 2019-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-01
相关资源
最近更新 更多