2013-10-12 72 views
7

我需要能夠寫我自己的分割字符串的方法讓喜歡Java中,寫我自己分割字符串的方法

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,#,,,,。所以我失去了如何修復它的所有空間,我還需要能夠允許我的代碼目前無法處理的多個分隔符。

另外我知道這段代碼現在真的很sl,,只是試圖在優化之前放下概念。

+2

我認爲這是一個學校任務或項目,對不對?因爲這在現實世界中完全沒有意義。 – SevenBits

+0

是的,它的任務。我知道在現實世界中,split()方法不僅僅是有能力的......只是跳過籃球。 – Exception

+0

當你說你「失去了間距」時,你是什麼意思?什麼間隔?你看到的問題可能是由於你的println()語句而不是你的函數嗎? – SevenBits

回答

3

的問題很簡單,你有一個偏移通過尋找新的比賽(POS)走,另一個則顯示最後一位的結束了,你找到了一個匹配(啓動)。

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; 
} 

這樣可以避免額外的循環,並且只複製一次每個字符。實際上,由於子字符串的工作方式,不會複製任何字符,只會創建指向原始字符緩衝區的小字符串對象。根本沒有字符串連接,這是一個重要的考慮因素。

+0

哇,工作完美無瑕。謝謝,既然我有邏輯,我可以自己寫,並添加多個分隔符的功能。 – Exception

+0

很高興爲你效勞。這個基本模式,'pos'和'start'非常有用。對於不同類型的解析器,我已經爲這個基本模式寫了50次。這是值得學習這種模式。 – AgilePro

0

它看起來像你得到的間距問題是因爲你的storeSplit數組是一個固定的長度。

假設您的輸入字符串長度爲5個字符;你的storeSplit數組裏有5個'空格'。該輸入字符串可能只包含一個分隔符;例如,「ab#ef」創建3個子字符串 - 「ab」,「#」和「ef」。

爲了避免這種情況,創建一個列表,而不是:

List<String> storeSplit = new ArrayList<String>(); 

然後,而不是增加您的櫃檯,在下探文本,添加到列表:

storeSplit.add(""+str.charAt(i)); 

而不是

storeSplit[counter] = ""+str.charAt(i); 
+0

謝謝,arrayList應該是我正在尋找的答案。 – Exception

2

我認爲你的問題是你正在分配storeSplit []的長度比你需要的長度。如果允許使用ArrayList,則使用它來累加結果(並使用ArrayList.toArray()方法獲取函數的最終返回值)。

如果你不能使用ArrayList,那麼你需要在返回它之前截斷你的數組(你的計數器變量將用於確定正確的長度)。爲此,您需要分配一個正確長度的數組,然後使用System.arraycopy來填充它。使用ArrayList更簡單,但我不知道您的任務的確切要求。

0

正如在註釋中指出的那樣,問題在於您將數組大小設置爲字符串的長度。相反,您希望將其設置爲將delimeters數加倍。然後,進行相應的調整:

  1. 如果第一個字符是一個分隔符,減去一個,
  2. 如果最後一個字符是分隔符,添加一個。
// Calculate number of delimiters in str 
int delimiters = str.length() - str.replaceAll(regex, "").length(); 
// Calculate array size 
int arraySize = (delimiters * 2) + (str.startsWith(regex) ? -1 : 0); 
arraySize = str.endsWith(regex) ? arraySize : arraySize + 1; 
String[] storeSplit = new String[arraySize]; 
+0

哦哇,這是一個好主意,我一直在努力找到一個'公式'來獲得正確的長度 – Exception

+0

爲示例添加了一些代碼。 –

0

這裏是我會做什麼:

String[] test1 = "ab#cd#efg#".split("#");//splits the string on '#' 
String result=""; 
for(String test:test1)//loops through the array 
    result+="#"+test;//adds each member to the array putting the '#' in front of each one 
System.out.println(result.substring(1));//prints out the string minus the first char, which is a '#' 

我希望這有助於。

+0

我假設只有結果數 – TAAPSogeking

0

here is the output of my code simply click on it封裝演示;

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]}}