如何使用substring()方法在java中实现trim()方法

时间:2016-02-05 21:20:50

标签: java string

我知道这个问题非常愚蠢,但在接受采访时我被告知要实现trim()方法,而不使用String类除了substring()方法之外的任何方法。

我通过使用toCharArray()然后识别String的第一个和最后一个有效字符来解决这个问题。但被告知不要使用toCharArray()方法。

有人可以提出一些方法吗。

允许使用Objects类的Overriden方法,如equals()和hashCode()。

6 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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
    
  3. 两者似乎都是合法的解决方案。 我想知道他们的解决方案 - 或者这是一个不可能回答的问题。

答案 2 :(得分:1)

Hacky,但无论如何这个问题都是愚蠢的:

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 "));

答案 3 :(得分:0)

您可以作弊,而是间接调用String方法:

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

如果有人要求,您不会在String上调用任何方法,甚至不会substring()StringBuilder为你做到了。 :)

总而言之,这是一个可怕的问题,我不担心。

答案 4 :(得分:0)

一个非常低效的解决方案,但现在就可以了。

你在评论中说可以使用.equals()方法。所以这是我精心设计的解决方案:

你知道汽车里程计数器吗?去0000,0001,0002 ......等等?使用char arrayList模仿它。

从大小1开始,然后使用mainString.equals(charArrayList.toString())对每个字符进行比较。如果您浏览了所有字符,并且没有匹配,请将大小增加1并重复。匹配后,您可以在开头和结尾检查空格字符。

请记住,我知道这不是很有效,但它确实有效。即使需要一年时间:)

希望这有帮助!

答案 5 :(得分:0)

如果您从length()方面重新定义charAt()substring开始并不太难......当然效率低下(现在需要很长时间) 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);
  }