如何将字符串的多个部分放入列表中?
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#split
将String
拆分为单词数组
如何使用 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
,而 i
、a
和 oo
进入 list
。如果我误解了你的意图,请纠正我。
您正在路上,似乎了解基本知识。我看到的问题很小,但您当然想解决它们:
正如@RicharsSchwartz 提到的,要查找zip
、zap
和zoop
等所有字符串,您需要在找到每个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
中取出a
,zappa
将变为zpp
(不是zppa
),而azap
将变为zp
。没有简单的方法可以从String
中删除一个特定的子字符串。我认为解决方案是使用StringBuilder
类。它有一个delete
方法,可以删除两个指定索引之间的部分,这正是您所需要的。
最后您将更改后的字符串分配给不同的变量idk
,但随后您继续搜索sen
。这就像将zpzapityzoop
、zipzpityzoop
和zipzapityzp
依次分配给idk
,但从不分配zpzpityzp
。但是,如果您按照我刚才的建议使用 StringBuilder
,则一直使用相同的 StringBuilder
就可以了。
【讨论】:
以上是关于如何将字符串的多个部分放入列表中?的主要内容,如果未能解决你的问题,请参考以下文章