我想要一种方法来根据多个分隔符拆分给定的字符串。我不想使用正则表达式来实现这一点,因为我必须使用枚举将分隔符作为字符串拆分方法中的参数传递。
我使用了枚举并将分隔符作为参数传递,并将结果存储在一个列表中,该列表适用于单个分隔符。但是我无法解决需要根据另一个分隔符拆分剩余字符串的下一部分。
例如:
初始字符串 ="一.二#三">
new StringSplitter("one.two#three",Separator.dot.toString(),Separator.hash.toString())
returns: {“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 ",";
}
}
}
}
我希望代码 two 处理至少两个分隔符,并在字符串为"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 ",";
}
}
}
}
适用于任意数量的分隔符。它假定输入格式正确。 String.indexOf()
返回参数值第一次出现的索引
public static List<String> split(String input, Separator... givenSeparators) {
List<String> result=new ArrayList<>();
int s1=0;
for (Separator s:givenSeparators)
{
s1=input.indexOf(s.toString());
result.add(input.substring(0, s1));
input=input.substring(s1+1);
}
result.add(input);
return result;
}
我不使用正则表达式,所以不需要转义点:
dot {
public String toString() {
return ".";
}
},