我知道这个问题很愚蠢,但在一次采访中,我被告知不使用任何方法从String类实现trim()方法,除了substring( ) 方法。如何在java中使用substring()方法实现trim()方法
我使用toCharArray()来处理这个问题,然后确定String的第一个和最后一个有效字符。但被告知不要使用toCharArray()方法。
任何人都可以提出一些方法来做到这一点。
允许像equals()和hashCode()这样的Object类的Overriden方法。
我知道这个问题很愚蠢,但在一次采访中,我被告知不使用任何方法从String类实现trim()方法,除了substring( ) 方法。如何在java中使用substring()方法实现trim()方法
我使用toCharArray()来处理这个问题,然后确定String的第一个和最后一个有效字符。但被告知不要使用toCharArray()方法。
任何人都可以提出一些方法来做到这一点。
允许像equals()和hashCode()这样的Object类的Overriden方法。
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);
你可以欺骗,而是调用String
小号方法间接地:
StringBuilder sb = new StringBuilder(sb);
for (int i = 0; i < sb.length(); i++) {
char ch = sb.charAt(i);
...
}
如果有人问,你是不是调用任何方法对String
,甚至没有substring()
。 StringBuilder
是为你做的。 :)
总之,这是一个可怕的问题,我不会担心它。
当然substring
将需要修剪结果。
没有任何方法String
这将很难找到两端可能的空间。
仍然是:
外处理:
某种形式的
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) { ... }
使用超String类的方法。然而,没有一个没有被String自身覆盖。也许下面是允许的:
CharSequence cs = string;
// Use cs.charAt or Whatever
似乎都墨守成规的解决方案。 我很想知道他们的解决方案 - 或者这是一个不可能回答的问题。
这不是一个有效的答案。这个问题明确指出,这种伪微调方法需要使用'substring'方法。尽管您的解决方案有效,但它不符合问题的要求。 –
这是有效的afaik。他说他可以只使用子字符串,而不是它需要。 –
@MageXy我读到这个问题的方式,它说你不能使用除substring()之外的任何方法。它没有说你必须使用'substring()'。但是如果他们坚持,我可以得到匹配组的开始和结束索引,并在原始字符串上调用'substring()'。:) – biziclop
哈克,但问题是愚蠢的反正:
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 "));
一个非常低效的解决方案,但在这里不言而喻。
你说在评论中你可以使用.equals()方法。所以这里是我精心设计的解决方案:
你知道汽车里程计数器吗?那些去0000,0001,0002 ...等等?用char arrayList模仿它。
从大小1开始,并遍历每个字符,使用mainString.equals(charArrayList.toString())
来比较它。如果通过所有字符并且不匹配,请将大小增加1并重复。匹配完成后,您可以在开头和结尾检查空格字符。
请记住,我知道这不是有效的,但它的工作原理。即使需要一年:)
希望这有助于!
它不是,如果你通过在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);
}
确实使用'String#equals(..)'count作为String类的方法吗?我假设它会,但我想检查B/C这是一个重写方法从'对象' – Mshnik
提示:'String.indexOf()' – biziclop
你可以使用for循环与charAt()结合? – Spencer4134