【问题标题】:How can I put multiple parts of a string into a list?如何将字符串的多个部分放入列表中?
【发布时间】:2017-06-29 13:58:39
【问题描述】:

所以目标是在字符串中寻找像“zip”和“zap”这样的模式,以“z”开始,以“p”结束。然后,对于所有此类字符串,删除中间字母。

我想到的是,我使用 for 循环来检查字符串的每个字母,一旦它到达 'z',它会获取 indexOf('p') 并将其和中间的所有内容放入ArrayList,同时从原始字符串中删除自己,以便可以找到 indexOf('p')。

我该怎么做?

这是我目前的代码:

package Homework;

import java.util.Scanner;
import java.util.ArrayList;
import java.util.List;

public class ZipZap {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        List < String > list = new ArrayList < String > ();

        System.out.print("Write a sentence with no spaces:");
        String sen = in .next();
        int len = sen.length();
        int p1 = sen.indexOf('p');
        String word = null;
        String idk = null;

        for (int i = 0; i < len; i++) {
            if (sen.charAt(i) == 'z') {
                word = sen.substring(i, p1 + 1);
                list.add(word);
                idk = sen.replace(word, "");
                i = 0;
            }
        }
    }

}

【问题讨论】:

  • 也许看看String#splitString 拆分为单词数组
  • 如何使用 String.split 查找所有“z” (stackoverflow.com/questions/2206378/…)。然后对于列表中的每个单词,替换从第二个位置到第一个“p”之前的所有字母
  • 如果“p”出现在字母“z”之前,此代码将失败。即,“xxpxxzxxpxx”失败。 “xxzxxpxxz”也失败了。那是因为您只调用 sen.indexOf('p') 一次。您应该在找到“z”后调用它,并且应该使用带有两个参数的 indexOf() 版本,这样您就可以将“z”位置指定为搜索的开始位置。
  • 我知道这听起来有点愚蠢,但我不知道如何使用两个参数的方法。可以给个简单的解释吗?

标签: java arrays string arraylist indexing


【解决方案1】:

使用这个,这里我使用 "\bz.p\b" 模式来查找任何包含以 z 开头的 char 并以 p 结尾的任何单词

 String s ="Write a sentence with no zip and zap spaces:";
 s=s.replaceAll("\\bz.p\\b", "zp");
 System.out.println(s);

输出:

Write a sentence with no zp and zp spaces:

也可以

 s.replaceAll("z\\w+p", "zp");

在这里你可以检查你的字符串

https://regex101.com/r/aKaNTJ/2

【讨论】:

    【解决方案2】:

    我认为您是说输入 zipzapityzoop 应更改为 zpzpityzp,而 iaoo 进入 list。如果我误解了你的意图,请纠正我。

    您正在路上,似乎了解基本知识。我看到的问题很小,但您当然想解决它们:

    • 正如@RicharsSchwartz 提到的,要查找zipzapzoop 等所有字符串,您需要在找到每个z 之后查找p。当您在索引i 找到z 时,您可以使用sen.indexOf('p', i + 1)z 之后查找p(第二个参数导致搜索从该索引开始)。
    • 每次找到z 时,都会将i 设置回0,这将从字符串的开头重新开始。无需这样做,这样您的程序就永远不会停止。
    • 当我明白你只想要i 时,sen.substring(i, p1+1) 拿出了所有的zip。您需要将参数调整为substring()
    • 您对sen.replace(word, "") 的使用将替换所有出现的word。因此,一旦您将程序修复为从zap 中取出azappa 将变为zpp(不是zppa),而azap 将变为zp。没有简单的方法可以从String 中删除一个特定的子字符串。我认为解决方案是使用StringBuilder 类。它有一个delete 方法,可以删除两个指定索引之间的部分,这正是您所需要的。
    • 最后您将更改后的字符串分配给不同的变量idk,但随后您继续搜索sen。这就像将zpzapityzoopzipzpityzoopzipzapityzp 依次分配给idk,但从不分配zpzpityzp。但是,如果您按照我刚才的建议使用 StringBuilder,则一直使用相同的 StringBuilder 就可以了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-23
      • 2022-11-18
      • 1970-01-01
      • 2012-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多