Ваш код, извините, очень похож на C.
Java String
- это не char[]
.Вы говорите, что хотите удалить дубликаты из String
, но вместо этого берете char[]
.
Завершено ли это char[]
\0
?Не похоже, потому что вы берете все .length
массива.Но тогда ваш алгоритм пытается \0
-определить часть массива.Что произойдет, если в массивах нет дубликатов?
Ну, как написано, ваш код на самом деле выбрасывает ArrayIndexOutOfBoundsException
в последней строке!\0
нет места, потому что все слоты заняты!
Вы можете добавить проверку, чтобы не добавлять \0
в этом исключительном случае, но тогда как вы планируете использовать этот код в любом случае?Планируете ли вы иметь strlen
-подобную функцию для поиска первого \0
в массиве?А что будет, если их нет?(из-за уникального исключительного случая, описанного выше?).
Что произойдет, если оригинал String
/ char[]
содержит \0
?(кстати, это вполне допустимо в Java, см. JLS 10.9. Массив символов не является строкой )
Результатом будет беспорядок, и все потому, что вы хотите это сделатьвсе в стиле C и без дополнительного буфера.Вы уверены, что вам действительно нужно это сделать?Почему бы не работать с String
, indexOf
, lastIndexOf
, replace
и всеми высокоуровневыми API String
?Это слишком медленно, или вы только подозреваете, что это так?
«Преждевременная оптимизация - корень всех зол».Извините, но если вы даже не можете понять, что делает оригинальный код, то выяснить, как он будет вписываться в большую (и более сложную) систему, будет кошмаром.
Мое минимальное предложениесделать следующее:
- Сделать так, чтобы функция брала и возвращала
String
, то есть public static String removeDuplicates(String in)
- Внутренне, работает с
char[] str = in.toCharArray();
- Заменитьпоследняя строка на
return new String(str, 0, tail);
При этом используются дополнительные буферы, но по крайней мере интерфейс с остальной частью системы намного чище.
В качестве альтернативы, вы можетеиспользуйте StringBuilder
как таковой:
static String removeDuplicates(String s) {
StringBuilder noDupes = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
String si = s.substring(i, i + 1);
if (noDupes.indexOf(si) == -1) {
noDupes.append(si);
}
}
return noDupes.toString();
}
Обратите внимание, что это по сути тот же алгоритм, что и у вас, но гораздо чище и без большого количества маленьких угловых случаев и т. д.