首页 > 解决方案 > 想知道一种在不使用正则表达式的情况下根据作为参数传递的分隔符来拆分字符串的方法

问题描述

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

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

例如 :

初始字符串 = "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”且定界符为“。”时以以下方式工作。和“#”输出应该是一个包含[一二三]的列表。

标签: javastringsplit

解决方案


我的建议是用第一个分隔符替换其他分隔符。如果您还像“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 ",";
        }
    }

}

}


推荐阅读