9

入力が次のようになるように、独自の分割文字列メソッドを記述できる必要があります

String[] test1 = mySplit("ab#cd#efg#", "#");
System.out.println(Arrays.toString(test1));

[ab, #, cd, #, efg, #]コンソールに出力されます。これまでのところ、そのように分割する必要がありますが、私の方法では、2 つの区切り文字が連続しているか、区切り文字が入力の先頭にある厄介なスペースが残ります。

public static String[] mySplit(String str, String regex)
{
    String[] storeSplit = new String[str.length()];
    char compare1, compare2;
    int counter = 0;

    //Initializes all the string[] values to "" so when the string
    //and char concatonates, 'null' doesn't appear.
    for(int i=0; i<str.length(); i++) {
        storeSplit[i] = "";
    }

    //Puts the str values into the split array and concatonates until
    //a delimiter is found, then it moves to the next array index.
    for(int i=0; i<str.length(); i++) {
        compare1 = str.charAt(i);
        compare2 = regex.charAt(0);

            if(!(compare1 == compare2)) {
                storeSplit[counter] += ""+str.charAt(i);
            } else {
                counter++;
                storeSplit[counter] = ""+str.charAt(i);
                counter++;
            }
    }
    return storeSplit;
}

テスト メインでそのメソッドを使用すると、[ab、#、cd、#、efg、#、、、、] という出力が得られます。そのため、すべての間隔を修正する方法がわかりません。また、コードが現在処理していない複数の区切り記号を許可できるようにする必要もあります。

また、最適化の前に概念を説明しようとしているだけで、現時点ではこのコードが本当にずさんであることもわかっています。

4

9 に答える 9

5

問題は単純明快です。1 つのオフセットは、新しい一致 (pos) を見つけて歩き、もう 1 つは最後に一致を見つけた場所 (start) の終わりを示します。

public static String[] mySplit(String str, String regex)
{
    Vector<String> result = new Vector<String>;
    int start = 0;
    int pos = str.indexOf(regex);
    while (pos>=start) {
        if (pos>start) {
            result.add(str.substring(start,pos));
        }
        start = pos + regex.length();
        result.add(regex);
        pos = str.indexOf(regex,start); 
    }
    if (start<str.length()) {
        result.add(str.substring(start));
    }
    String[] array = result.toArray(new String[0]);
    return array;
}

これにより、余分なループが回避され、各文字が 1 回だけコピーされます。実際には、部分文字列の動作方法により、文字はコピーされず、元の文字バッファーを指す小さな文字列オブジェクトのみが作成されます。文字列の連結はまったく行われません。これは重要な考慮事項です。

于 2013-10-12T23:56:58.720 に答える
0

私はそれを解決するために再帰を使用しました。

static void splitMethod(String str, char splitChar, ArrayList<String> list) {
        String restOfTheStr = null;
        StringBuffer strBufWord = new StringBuffer();
        int pos = str.indexOf(splitChar);
        if(pos>=0) {
            for(int i = 0; i<pos; i++) {
                strBufWord.append(str.charAt(i));
            }
            String word = strBufWord.toString();
            list.add(word);
            restOfTheStr = str.substring(pos+1);//As substring includes the 
            //splitChar, we need to do pos + 1
            splitMethod(restOfTheStr, splitChar, list);
        }
        if(pos == -1) {
            list.add(str);
            return;
        }

    }

使用する:

ArrayList<String> list= new ArrayList<String>();//in this list
    //the words will be stored
    String str = "My name is Somenath";
    splitMethod(str,' ', list );
于 2019-01-27T23:58:53.087 に答える
0

これが私のコードの出力です 。パッケージのデモをクリックするだけです。

public class demo8 {

static int count = 0;
static int first = 0;
static int j = 0;

public static void main(String[] args) {

    String s = "ABHINANDAN TEJKUMAR CHOUGULE";
    int size = 0;

    for (int k = 0; k < s.length(); k++) {
        if (s.charAt(k) == ' ') {
            size++;
        }

    }

    String[] last = new String[size + 1];

    for (int i = 0; i < s.length(); i++) {
        int temp = s.length();

        if (i == s.length() - 1) {
            last[j] = s.substring(first, i + 1);
        }

        if (s.charAt(i) == ' ') {
            last[j] = s.substring(first, i);
            j++;
            first = i + 1;

        }

    }
    for (String s1 : last) {
        System.out.println(s1);
    }
[I tested my code and output is also attached with it ...!][1]}}
于 2016-11-30T15:01:29.877 に答える