RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1595141
Accepted
ZaRISt
ZaRISt
Asked:2024-09-29 00:02:07 +0000 UTC2024-09-29 00:02:07 +0000 UTC 2024-09-29 00:02:07 +0000 UTC

已知正确的 EQUALS 返回 FALSE,为什么会发生这种情况?

  • 772

任务:有一个字符串,您需要从中删除所有以“a”开头的单词并将其放入一个数组中。

我决定做什么:

  1. 将所有标点符号、空白符号和双空格替换为一个空格,以便我可以使用.split()
  2. 实际上我使用了它.split(" ")并立即将其结果放入 ArrayList
  3. 然后我想迭代这个集合并打印我需要的,并删除不需要的,但我遇到了一个异常:

线程“main”中的异常 java.util.ConcurrentModificationException

(后来我意识到我只能删除它,并且不会出现错误,但我已经想以不同的方式解决它)

  1. 我用谷歌搜索-->遇到了它Iterator,现在我想通过它来解决它以便更好地理解Java
  2. Iterator我在此基础上创建了它ArrayList- 然后我想while遍历迭代器,如果第一个字符是"a",则打印该单词 - 否则我从迭代器中删除该单词。

但这就是问题开始的地方:

if ("a".equals(String.valueOf(a.charAt(0)))) {这是哪里a:

String a = String.valueOf(iterator.next());

回来了false,不知道为什么……

与此同时,我决定在这个循环之后显示迭代器的所有元素,但我没有显示任何一个,这原则上是合乎逻辑的,因为条件返回 false,所有内容都被删除了,但随后,为了好玩,我输入的索引不是 0 ,而是 1,我在循环中得到了迭代器的所有单词,但是在循环中我仍然没有得到一个单词,好像上一个循环已经将它们全部删除了,这不可能发生,因为事实是真的。12

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

public class Main {

    public static void main(String[] args) {
        test1();
    }

    public static void test1() {
        String text = "aajiwi aiwefhfhwe wagw, gerhbdf - aiwrhgwbdb wfgw. Drgbibv awhgbwwb: gfuihwergb rg ywrgyf.";
        text = text.replaceAll("[,^%$#@!^:;'/\"&*()?><\\-.]", "").replaceAll("  ", " ");
        ArrayList<String> res = new ArrayList<>();
        res.add(Arrays.toString(text.split(" ")));
        System.out.println(res); // Задача из строки изъять все слова начинающиеся с "a" и поместить в массив
        Iterator iterator = res.iterator();
        while (iterator.hasNext()) {
            String a = String.valueOf(iterator.next());
            if ("a".equals(String.valueOf(a.charAt(0)))) { 
                System.out.println(a);
            } else {
                iterator.remove();
            }
        }
        while (iterator.hasNext()) {
            System.out.println("AAAAAAAAA chto za fygniya");
        }
    }
}

如果索引0 则输出:

[[aajiwi, aiwefhfhwe, wagw, gerhbdf, aiwrhgwbdb, wfgw, Drgbibv, awhgbwwb, gfuihwergb, rg, ywrgyf]]
    
Process finished with exit code 0

如果索引1 则输出:

[[aajiwi, aiwefhfhwe, wagw, gerhbdf, aiwrhgwbdb, wfgw, Drgbibv, awhgbwwb, gfuihwergb, rg, ywrgyf]]
    
[aajiwi, aiwefhfhwe, wagw, gerhbdf, aiwrhgwbdb, wfgw, Drgbibv, awhgbwwb, gfuihwergb, rg, ywrgyf]

Process finished with exit code 0

为什么if会返回 false?

java
  • 2 2 个回答
  • 96 Views

2 个回答

  • Voted
  1. Best Answer
    Nowhere Man
    2024-09-29T01:05:37Z2024-09-29T01:05:37Z

    您应该在逐步调试模式下运行您的程序,以确保它不完全符合预期,而是完全符合其编码的目的。

    所提供代码中的主要问题在于:

    res.add(Arrays.toString(text.split(" ")));
    System.out.println(res);
    // [[aajiwi, aiwefhfhwe, wagw, gerhbdf, aiwrhgwbdb, wfgw, Drgbibv, awhgbwwb, gfuihwergb, rg, ywrgyf]]
    

    因为它将单个字符串作为调用结果写入列表res ,即整个字符串数组的字符串表示形式:Arrays.toString(text.split(" "))
    "[aajiwi, aiwefhfhwe, wagw, gerhbdf, aiwrhgwbdb, wfgw, Drgbibv, awhgbwwb, gfuihwergb, rg, ywrgyf]"

    当然,这样的字符串的第一个字符是'[',第二个字符是'a',并且将来列表迭代器res将只处理这个单个字符串。

    因此,首先应该正确地将字符串数组写入列表中res,例如使用以下方法Collections::addAll(Collection<? super T> c, T ... elements):

    ArrayList<String> res = new ArrayList<>();
    Collections.addAll(res, text.split(" "));
    

    或使用以下方法Arrays.asList:

    List<String> res = new ArrayList<>(Arrays.asList(text.split(" ")));
    

    之后,您应该使用迭代器重写该部分:使其键入,在检查第一个字符时删除不必要的字符串转换,使用String::startsWith

    Iterator<String> iterator = res.iterator();
    while (iterator.hasNext()) {
        String word = iterator.next();
        if (word.startsWith("a")) {
            System.out.println(word);
        } else {
            iterator.remove();
        }
    }
    System.out.println(res); // [aajiwi, aiwefhfhwe, aiwrhgwbdb, awhgbwwb]
    

    如果您仍然需要获取问题陈述中所示的单词数组作为结果,那么您将必须转换结果列表res:

    String[] result = res.toArray(new String[0]);
    

    还应该注意的是,使用恐慌消息循环迭代器:
    while (iterator.hasNext()) { System.out.println("УЖОС!");}
    本身没有意义,因为迭代器完成了上一个循环中的工作,但如果不是这样,那么这个循环将是无限的。


    解决主要问题的可能替代方法:

    • 使用正则表达式查找字符串中的单词Matcher::find:
    Pattern startWithA = Pattern.compile("\\ba\\p{L}*");
    
    List<String> res = new ArrayList<>();
    Matcher matcher = startWithA.matcher(text);
    while (matcher.find()) {
        res.add(matcher.group());
    }
    

    其中\\ba\\p{L}*描述了以下单词格式:单词边界\\b,英语单词的第一个字母a后跟0个或多个其他字母\\p{L}*

    • 使用 Stream API 和改进的分词正则表达式text.split("\\P{L}+"),分隔符是 1 个或多个任何非字母字符:
    String[] result = Arrays.stream(text.split("\\P{L}+"))
        .filter(w -> w.startsWith("a"))
        .toArray(String[]::new);
    
    • 5
  2. talex moved to Codidact
    2024-09-29T00:46:38Z2024-09-29T00:46:38Z

    要将字符串数组添加到列表中,您需要使用:

    res.addAll(List.of(text.split(" ")));
    
    • 2

相关问题

  • wpcap 找不到指定的模块

  • 如何以编程方式从桌面应用程序打开 HTML 页面?

  • Android Studio 中的 R.java 文件在哪里?

  • HashMap 初始化

  • 如何使用 lambda 表达式通过增加与原点的距离来对点进行排序?

  • 最大化窗口时如何调整元素大小?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5