2016-02-05 135 views
3

我知道這個問題很愚蠢,但在一次採訪中,我被告知不使用任何方法從String類實現trim()方法,除了substring( ) 方法。如何在java中使用substring()方法實現trim()方法

我使用toCharArray()來處理這個問題,然後確定String的第一個和最後一個有效字符。但被告知不要使用toCharArray()方法。

任何人都可以提出一些方法來做到這一點。

允許像equals()和hashCode()這樣的Object類的Overriden方法。

+0

確實使用'String#equals(..)'count作爲String類的方法嗎?我假設它會,但我想檢查B/C這是一個重寫方法從'對象' – Mshnik

+1

提示:'String.indexOf()' – biziclop

+0

你可以使用for循環與charAt()結合? – Spencer4134

回答

5
String untrimmed = " some string "; 
String trimmed = ""; 

String innerSpaces = ""; 
boolean wordBoundary = true; 

try { 
    for (int i = 0; ; i++) { 
     String substr = untrimmed.substring(i, i + 1); 

     if (!substr.equals(" ") && !substr.equals("\t") && 
       !substr.equals("\n") && !substr.equals("\r")) { 

      trimmed += innerSpaces + substr; 
      wordBoundary = false; 
      innerSpaces = ""; 
     } 
     else if (!wordBoundary) { 
      innerSpaces += substr; 
     } 
    } 
} 
catch (IndexOutOfBoundsException e) { } 

System.out.println(trimmed); 
+2

'try-catch'是可怕的 – Dici

+4

沒有其他方式知道字符串結束時不知道它的長度。有什麼建議麼? –

+0

這是真的,但我認爲他只是曲解了這個問題。當然,他應該有權訪問只獲取有關陣列本身的底層char數組的一些信息的方法。但我明白你的意思了...... – Dici

0

你可以欺騙,而是調用String小號方法間接地:

StringBuilder sb = new StringBuilder(sb); 
for (int i = 0; i < sb.length(); i++) { 
    char ch = sb.charAt(i); 
    ... 
} 

如果有人問,你是不是調用任何方法對String,甚至沒有substring()StringBuilder是爲你做的。 :)

總之,這是一個可怕的問題,我不會擔心它。

4

當然substring將需要修剪結果。

沒有任何方法String這將很難找到兩端可能的空間。

仍然是:

  1. 外處理:

    某種形式的

    Pattern pattern = Pattern.compile("\\s*(\\S*)\\s*"); // Pattern not okay 
    Matcher m = pattern.matcher(string); 
    string = m.matches()? m.group(1) : string; 
    

    或者:

    Set<String> set0 = new HashSet<>(); 
    set0.add(string); 
    Set<String> set = new HashSet<>(); 
    try { 
        set.add(" " + string.substring(1)); 
        if (set0.contains(set)) { 
         ... 
    } catch (IndexOutOfRangeException e) { ... } 
    
  2. 使用超String類的方法。然而,沒有一個沒有被String自身覆蓋。也許下面是允許的:

    CharSequence cs = string; 
    // Use cs.charAt or Whatever 
    

似乎都墨守成規的解決方案。 我很想知道他們的解決方案 - 或者這是一個不可能回答的問題。

+0

這不是一個有效的答案。這個問題明確指出,這種僞微調方法需要使用'substring'方法。儘管您的解決方案有效,但它不符合問題的要求。 –

+0

這是有效的afaik。他說他可以只使用子字符串,而不是它需要。 –

+0

@MageXy我讀到這個問題的方式,它說你不能使用除substring()之外的任何方法。它沒有說你必須使用'substring()'。但是如果他們堅持,我可以得到匹配組的開始和結束索引,並在原始字符串上調用'substring()'。:) – biziclop

0

哈克,但問題是愚蠢的反正:

public static String trim(String s) { 
    StringBuilder sb = new StringBuilder(s); 
    int start, end; 
    for (start = 0; start < sb.length() && Character.isWhitespace(sb.charAt(start)); start++); 
    for (end = sb.length() - 1; end > start && Character.isWhitespace(sb.charAt(end)); end--); 
    return sb.substring(start, end + 1); 
} 

System.out.println(trim(" \n \t trim me \t ")); 
0

一個非常低效的解決方案,但在這裏不言而喻。

你說在評論中你可以使用.equals()方法。所以這裏是我精心設計的解決方案:

你知道汽車裏程計數器嗎?那些去0000,0001,0002 ...等等?用char arrayList模仿它。

從大小1開始,並遍歷每個字符,使用mainString.equals(charArrayList.toString())來比較它。如果通過所有字符並且不匹配,請將大小增加1並重復。匹配完成後,您可以在開頭和結尾檢查空格字符。

請記住,我知道這不是有效的,但它的工作原理。即使需要一年:)

希望這有助於!

0

它不是,如果你通過在substring方面重新定義length()charAt()下手太狠......當然,這是低效的(長度現在只需O(n^2)),但它能夠完成任務,並作爲獎金定義了length()charAt()

public static int length(String s) { 
    for(int i = 0; i < Integer.MAX_VALUE; i++) { 
     try { 
     s.substring(i); 
     }catch(StringIndexOutOfBoundsException e) { 
     return i - 1; 
     } 
    } 
    return Integer.MAX_VALUE; 
    } 

    public static char charAt(String s, int idx) { 
    String c = s.substring(idx, idx+1); 
    return (char)c.hashCode(); 
    } 

    public static String trim(String s) { 
    final int length = length(s); 
    int startIndex; 
    int endIndex; 

    for(startIndex = 0; startIndex < length; startIndex++) { 
     char c = charAt(s, startIndex); 
     if(! Character.isWhitespace(c)) { 
     break; 
     } 
    } 

    for(endIndex = length; endIndex > startIndex; endIndex--) { 
     char c = charAt(s, endIndex - 1); 
     if(! Character.isWhitespace(c)) { 
     break; 
     } 
    } 
    return s.substring(startIndex, endIndex); 
    }