如何将字符串的多个部分放入列表中?

Posted

技术标签:

【中文标题】如何将字符串的多个部分放入列表中?【英文标题】: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” (***.com/questions/2206378/…)。然后对于列表中的每个单词,替换从第二个位置到第一个“p”之前的所有字母 如果“p”出现在字母“z”之前,此代码将失败。即,“xxpxxzxxpxx”失败。 “xxzxxpxxz”也失败了。那是因为您只调用 sen.indexOf('p') 一次。您应该在找到“z”后调用它,并且应该使用带有两个参数的 indexOf() 版本,这样您就可以将“z”位置指定为搜索的开始位置。 我知道这听起来有点愚蠢,但我不知道如何使用两个参数的方法。可以给个简单的解释吗? 【参考方案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 就可以了。

【讨论】:

以上是关于如何将字符串的多个部分放入列表中?的主要内容,如果未能解决你的问题,请参考以下文章

java读取文件中多个数据,放入不同数组

如何将 youtube 字幕放入列表中?

如何将文件路径+文件名放入列表中? [复制]

如何从一行中删除某些单词,但将其余部分放入带有批处理的字符串/变量中?

将文件中的字符读入列表

c语言如何将多个字符串放入数组