【问题标题】:Check if specific element in array contains a certain String. Then delete the element检查数组中的特定元素是否包含某个字符串。然后删除元素
【发布时间】:2017-09-28 09:41:51
【问题描述】:

我有一个 ArrayList,其中包含:[2x, 5, 6x]。我想去掉包含“x”的元素,但是 contains() 方法适用于 ArrayList 中的所有元素。

我的尝试:

boolean ready = false;

while(!ready){
    if(first element in the array contains "x"){
    remove that element
    Check next element in line
}

当检查所有元素并删除包含“x”的元素时,将ready设置为true,并停止循环。 我希望输出只是:[6]。然后将其转换为 int,而不是 String。

编辑: 我无法让它与 ArrayList 一起使用,因为我无法更改 ArrayList 的内容。因此,我将其更改为一个简单的数组。 数组现在是: String[]tokens = ligning2.split("-|\+|\*|\/");

所以令牌数组将保持 [2x, 5, 6x]。那么如何用这种Array而不是Arraylist来删除包含x的元素呢?

【问题讨论】:

  • 您需要发布一个新问题并指定您的最新问题,您的最新编辑不太可能引起太多关注。

标签: java arrays string arraylist


【解决方案1】:
  • 使用迭代器迭代列表
  • 对于每次迭代,如果当前String 包含“x”String,则将其从List 中删除,并使用Iterator.remove();

例如:

   for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
        String value = list.next();
        if(value.contains("x"){
           iterator.remove();
        }
    }

【讨论】:

  • 正如我对@JacobG 所说,我收到以下错误:java.lang.UnsupportedOperationException。我也看过其他遇到此问题的人,但他们的 ArrayList 与我的不同,因为我将其拆分。我的是:List&lt;String&gt; asList = Arrays.asList(ligning2.split("-|\\+|\\*|\\/"));
  • JacobG 解决方案无法工作。不要将Arrays.asList(..)removeIf() 方法混用。 Arrays.asList(..) 产生一个不可修改的 ArrayList。使用new ArrayList() 创建您的列表然后迭代拆分结果的数组以使用add(..) 方法填充ArrayList
  • 我更像是一个初学者,所以如果你能给我一个例子,我会很激动。我有一个包含让我们说“2x+3”的字符串变量。我用 split("-|\\+|\\*|\\/") 拆分它我如何用 new ArrayList() 而不是 Arrays.asList(..) 来做呢?我不确定你所说的迭代是什么意思。
  • 如果我没有将 NodeList 包含到令牌中,则会出现错误,所以我这样做了:NodeList token = split("-|\\+|\\*|\\/");。我得到的下一个错误是for (String current : token),它给出“foreach 不适用于所需的表达式类型:找到数组或 java.lang.literable:NodeList”
  • token 确实是一个数组。试试String[] token = split("-|\\+|\\*|\\/"); List&lt;String&gt; list = new ArrayList(); for (String current : token){ list.add(current); }
【解决方案2】:

例如,您可以使用迭代器:

List<String> list = Arrays.asList("Hello", "xyz", "tkx");
Iterator<String> iter = list.iterator();
while (iter.hasNext()) {
    if(iter.next().contains("x")){//check if your element contain x
        iter.remove();//if yes remove it
    }
}

【讨论】:

  • 不错的经典解决方案^^.
  • @YCF_L 你将如何避免我得到的 UnsupportedOperationException 错误?我知道它为什么在那里,但我不知道如何避免它。我尝试使用“普通”数组,但我不知道该怎么做。
  • @Bassusour 对迟到的评论感到抱歉,你是什么意思?
【解决方案3】:

这将是在调用 List#removeIf 时使用 lambda 的绝佳机会。

例如:

List<String> list = Arrays.asList("2x", "5", "6x");

System.out.println(list); // [2x, 5, 6x]

list.removeIf(element -> element.contains("x"));

System.out.println(list); // [5]

假设List 中可以保留多个不包含“x”的值,您可以使用Stream 将每个元素映射到其整数值:

List<Integer> newList = list.stream()
                            .map(Integer::valueOf)
                            .collect(Collectors.toList());

整个算法可以浓缩成以下:

List<Integer> newList = list.stream()
                            .filter(element -> !element.contains("x"))
                            .map(Integer::valueOf)
                            .collect(Collectors.toList());

【讨论】:

  • @OusmaneMahyDiaw 为什么要在我帖子中的单词拼写已经正确的情况下编辑它们?
  • 抱歉,我住在英国,因此我建议这是正确的方法,我猜美国的拼写不同。但请注意,我还编辑了您的代码,因为如果我保持原样,它将无法编译。
  • 是的,感谢您添加引号。在美国拼写为“利用”;)
【解决方案4】:

你可以使用这个程序

package com.anand;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.ListIterator;

public class ArrayListRemove {
static ArrayList<String> al=new ArrayList<>(Arrays.asList("6x","8","5x"));
public static void main(String[] args) {
    Iterator<String> i=al.iterator();
    while(i.hasNext())
    {
        if(i.next().toString().contains("x"))
        {
            i.remove();
        }
    }
    ListIterator<String> li= al.listIterator();
    while(li.hasNext())
    {
        System.out.println(li.next());
    }

}

}

请让我知道您想创建一个新的整数数组列表,或者只是输出为整数。我会做出相应的改变

【讨论】:

    【解决方案5】:

    最简单的方法是使用Streams。这些是在 Java 8 中添加的,您可以在您的情况下使用它们来过滤列表中的某些项目,并在一次运行中将它们转换为整数:

    List<String> elements = Arrays.asList("2x", "5", "6x");
    List<Double> result = elements.stream()
         .filter(entry -> !entry.contains("x"))
         .map(Double::valueOf) //this assumes that all other entries are valid doubles
         .collect(Collectors.toList());
    

    【讨论】:

    • 感谢您的编辑(而不是简单地投反对票)。很着急,甚至没有注意到那些错误
    • 注意在java中我们使用-&gt;,但我可以看到你从(C#)得到=&gt;,它也不是Collectors.asList()而是Collectors.toList()。这可能是一个我理解的错误。我已经编辑过了。 +1。
    • 我犯了一个错误,没有告知它不是整数,但我想用双精度来做。您能否更改您的代码,使其使用双精度而不是整数?我试图将列表更改为 Double,但在 .collect(Collectors.toList()); 处出现错误
    • 编辑了我的答案。 Double 类也有 valueOf 方法,它接受一个字符串并尝试解析一个双精度数。关于这个方法究竟接受什么作为有效输入的详细文档可以在这里找到:docs.oracle.com/javase/8/docs/api/java/lang/…
    猜你喜欢
    • 2013-07-31
    • 1970-01-01
    • 2019-10-22
    • 2016-05-17
    • 1970-01-01
    • 2016-06-17
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多