想知道一种基于作为参数传递的分隔符而不使用正则表达式来拆分字符串的方法



我想要一种方法来根据多个分隔符拆分给定的字符串。我不想使用正则表达式来实现这一点,因为我必须使用枚举将分隔符作为字符串拆分方法中的参数传递。

我使用了枚举并将分隔符作为参数传递,并将结果存储在一个列表中,该列表适用于单个分隔符。但是我无法解决需要根据另一个分隔符拆分剩余字符串的下一部分。

例如:

初始字符串 ="一.二#三">

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 ".";
    }
},

最新更新