首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算字符串是按字母顺序排列,还是按字母顺序反向排列

计算字符串是按字母顺序排列,还是按字母顺序反向排列
EN

Code Review用户
提问于 2016-02-05 01:05:00
回答 1查看 784关注 0票数 3

目的性

这个问题来自于关于日报程序员的这个问题

基本上,任务是编写一个实现来标识String中的字符是否在

  • 字母顺序(A至Z)
  • 逆字母顺序(Z到A)
  • 不按字母顺序或反向字母顺序("abba")
  • 字母顺序和反向字母顺序(在String中只有一个不同的字符)

Implementation

代码语言:javascript
复制
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语句)。
EN

回答 1

Code Review用户

回答已采纳

发布于 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>太过分了。

代码语言:javascript
复制
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));
        }
    }
}
票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/118946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档