java - 想知道一种在不使用正则表达式的情况下根据作为参数传递的分隔符来拆分字符串的方法
问题描述
我想要一种基于多个分隔符拆分给定字符串的方法。我不想使用正则表达式来实现这一点,因为我必须使用枚举将分隔符作为字符串拆分方法中的参数传递。
我使用枚举并将分隔符作为参数传递,并将结果存储在一个列表中,该列表适用于单个分隔符。但是我无法解决需要根据另一个分隔符拆分剩余字符串的下一部分。
例如 :
初始字符串 = "one.two#three"
new StringSplitter("one.two#three",Separator.dot.toString(),Separator.hash.toString())
returns: {“one”, “two”, “three”}
我能够以某种方式获得“onetwo three”或“one”和“two three”作为输出,但不是所有子字符串都放在一个列表中。请参阅下面的代码,了解我到目前为止所尝试的内容。
public class StringSplitter {
public String givenString;
public String givenSeparator;
public String anotherSeparator;
public StringSplitter (String givenString, String givenSeparator, String anotherSeparator) {
this.givenString=givenString;
this.givenSeparator=givenSeparator;
this.anotherSeparator=anotherSeparator;
}
public List<String> SplitMethod() {
List<String> FirstSplitList = Arrays.asList(givenString.split(givenSeparator));
System.out.println(FirstSplitList);
StringBuilder sb = new StringBuilder();
for (String ch:FirstSplitList) {
if(ch.contains(anotherSeparator)) {
sb.append(ch);
}
}
String newStringtoSplit = sb.toString();
System.out.println(newStringtoSplit);
List<String> newString = Arrays.asList(newStringtoSplit.split(anotherSeparator));
System.out.println(newString);
return newString;
}
public static void main (String[] args) {
StringSplitter var = new StringSplitter("one.two#three",Separator.dot.toString(),Separator.hash.toString());
var.SplitMethod();
}
enum Separator{
dot {
public String toString() {
return "\\.";
}
},
hash {
public String toString() {
return "#";
}
},
comma {
public String toString() {
return ",";
}
}
}
}
我希望代码二处理至少两个定界符并在字符串为“one.two#three”且定界符为“。”时以以下方式工作。和“#”输出应该是一个包含[一二三]的列表。
解决方案
我的建议是用第一个分隔符替换其他分隔符。如果您还像“one.two.three”一样重复分隔符,它也可以工作
public class StringSplitter {
public String givenString;
public String[] separators;
public StringSplitter (String givenString, String... separators) {
this.givenString=givenString;
this.separators = separators;
if(this.givenString == null || this.separators == null || this.separators.length < 1 ) {
throw new IllegalArgumentException("invalid arguments passed");
}
}
public List<String> splitMethod() {
String newGivenString = givenString;
// replace all other separators with the first one
if(separators.length > 1) {
// skip the first separator
for(int idx = 1; idx < separators.length; idx++) {
newGivenString = newGivenString.replaceAll(separators[idx], separators[0]);
}
}
List<String> splitList = Arrays.asList(newGivenString.split(separators[0]));
System.out.println(splitList);
return splitList;
}
public static void main (String[] args) {
StringSplitter var = new StringSplitter("one.two#three",Separator.DOT.toString(),Separator.HASH.toString());
var.splitMethod();
var = new StringSplitter("one.two#three,four",Separator.DOT.toString(),Separator.HASH.toString(),Separator.COMMA.toString());
var.splitMethod();
var = new StringSplitter("one.two#three four",Separator.DOT.toString());
var.splitMethod();
}
enum Separator{
DOT {
@Override
public String toString() {
return "\\.";
}
},
HASH {
@Override
public String toString() {
return "#";
}
},
COMMA {
@Override
public String toString() {
return ",";
}
}
}
}
推荐阅读
- javascript - HighCharts Angular - 如果数据系列为空,则显示 noData
- python - pandas替换优化
- sql-server - 获取 CSV 文件列表,然后将它们批量插入到表中
- reactjs - React Native 标签选择屏幕挂了一段时间
- r - r markdown中的Mapview多个地图鼠标悬停事件
- vue.js - vue3-cookies 和 Vue composition api 奇怪的错误?
- python - Networkx PageRank 基于接收较低的权重为顶点提供更高的排名
- javascript - 用某些锁定字符对输入标签进行编码的最佳方法是什么?
- php - 寻找正确的查询以提取某些总数
- google-apps-script - Apps 脚本超时优化