这个问题来自于关于日报程序员的这个问题。
基本上,任务是编写一个实现来标识String中的字符是否在
"abba")String中只有一个不同的字符)public class StringCharactersInAlphabeticalOrderEvaluatorImpl implements StringCharactersInAlphabeticalOrderEvaluator {
private final List<Character> charactersFromAtoZ;
public StringCharactersInAlphabeticalOrderEvaluatorImpl(final List<Character> charactersFromAtoZ) {
this.charactersFromAtoZ = charactersFromAtoZ;
}
@Override public AlphabeticalOrderState evaluateAlphabeticalOrderOfCharacters(final String candidate) {
final char[] stringChars = candidate.toUpperCase().toCharArray();
int index = 0;
boolean fromAtoZ = true;
boolean fromZtoA = true;
while (index < stringChars.length - 1) {
if (charactersFromAtoZ.indexOf(stringChars[index]) > charactersFromAtoZ.indexOf(stringChars[index + 1])) {
fromAtoZ = false;
}
if (charactersFromAtoZ.indexOf(stringChars[index]) < charactersFromAtoZ.indexOf(stringChars[index + 1])) {
fromZtoA = false;
}
index++;
}
if (!fromAtoZ && !fromZtoA) {
return AlphabeticalOrderState.IN_NEITHER_ALPHABETICAL_NOR_REVERSE_ALPHABETICAL_ORDER;
}
if (fromAtoZ && fromZtoA) {
return AlphabeticalOrderState.IN_BOTH_ALPHABETICAL_AND_REVERSE_ALPHABETICAL_ORDER;
}
if (fromAtoZ) {
return AlphabeticalOrderState.IN_ALPHABETICAL_ORDER;
}
if (fromZtoA) {
return AlphabeticalOrderState.IN_REVERSE_ALPHABETICAL_ORDER;
}
throw new RuntimeException("unexpected character string");
}
}我想要关于我的实现的反馈,特别是
BothAlphabeticalAndReverseAlphabetical案例)?if语句)。发布于 2016-02-05 08:06:52
我认为你的解决方案设计过度了。我认为没有太多理由定义包含一个StringCharactersInAlphabeticalOrderEvaluator方法的evaluateAlphabeticalOrderOfCharacters(String)接口。您是否计划编写StringCharactersInAlphabeticalOrderEvaluatorImpl以外的实现?有任何理由有任何理由拥有一个对象吗?
公平地说,不同的语言有不同的校对规则。例如,在西班牙语中,字母n是n,直到规则在1994年被简化之前,有向图h被看作是c和d之间的字母,而ll被看作是L和m之间的字母。然而,如果我们要变得花哨和概括,我建议使用Collator“正确地”做它。
然而,这个练习被标记为“容易”。看起来"ASCIIbetical“顺序已经足够好了:我们不必考虑大小写折叠、有向图、diacritics、Unicode代理项对或特定于地区的规则。为此,我们可以使用char减法或Character.compare(char, char)来比较代码点。
您已经将evaluateAlphabeticalOrderOfCharacters()作为一个单块函数来实现,这违反了单一责任原则。让它进行两种排序检查并将结果分类为四类并没有太大的优势。你最好暴露两张独立的支票。实际上,通过拆分它,您可以节省几次循环迭代,因为每个循环一旦检测到异常字符就可以尽早退出。
这个类中的主要函数是isAlphabeticalOrder()和isReverseAlphabeticalOrder()。它们都委托给isMonotonic()助手函数,以避免代码重复。有一个classifyOrder()助手来生成要在main()中打印的结果字符串。
我使用的是CharSequence而不是String,它暗示字符串将更多地被解释为字符序列。我认为List<Character>太过分了。
import java.util.Scanner;
public class AlphabeticalOrderChecker {
private static int ASCENDING = +1,
DESCENDING = -1;
private static boolean isMonotonic(CharSequence cs, int trend) {
for (int i = 1; i < cs.length(); i++) {
if (trend * Character.compare(cs.charAt(i - 1), cs.charAt(i)) > 0) {
return false;
}
}
return true;
}
public static boolean isAlphabeticalOrder(CharSequence cs) {
return isMonotonic(cs, ASCENDING);
}
public static boolean isReverseAlphabeticalOrder(CharSequence cs) {
return isMonotonic(cs, DESCENDING);
}
private static String classifyOrder(CharSequence cs) {
boolean asc = isAlphabeticalOrder(cs);
boolean desc = isReverseAlphabeticalOrder(cs);
return (asc && desc) ? "IN ORDER AND REVERSE ORDER" :
(asc) ? "IN ORDER" :
(desc) ? "REVERSE ORDER" :
"NOT IN ORDER";
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNextLine()) {
String s = sc.nextLine();
System.out.printf("%s %s\n", s, classifyOrder(s));
}
}
}https://codereview.stackexchange.com/questions/118946
复制相似问题