1

给定以下字符:“R”、“G”、“B”和“X”。必须一次将它们添加到长度从 0 到 5 不等的现有String中。此长度包括特殊字符/。即,现有字符串可能如下所示:

  • null
  • “”(空字符串)
  • “G”
  • “B/X”
  • “G/B”
  • “R/G/B”
  • 等(上述的其他变体)

最后的字符串应始终具有"G/R/B/X"的顺序:

  • G必须是第一项。
  • X必须是最后一项。
  • R必须在之后G和之前B
  • B必须追上来R

这些字符中的任何一个都可能存在也可能不存在。

如果现有字符串只有一个字符,它看起来非常简单:

private String sortThemAll(String existingString, String newString) {
    if (TextUtils.isEmpty(existingString)) {
        return newString;
    }

    if (existingString.length() == 1) {
        List<String> list = Arrays.asList(existingString, newString);
        if (list.contains("G") && list.contains("R")) {
            Collections.sort(list);
        } else {
            Collections.sort(list, Collections.reverseOrder());
        }

        return list.get(0).concat("/").concat(list.get(1));
    }

    if (existingString.length() == 3) { // e.g., "B/X"
        // Assuming that existingString is already sorted
        if ("G".equals(newString)) {
            // G should always be the first item on the list
            return newString.concat("/").concat(existingString);
        }
        if ("X".equals(newString)) {
            // X should always be the last item on the list
            return existingString.concat("/").concat(newString);
        }
        /*** I don't know how I should proceed from this point ***/
    }

    return existingString.concat("/").concat(newString);
}

我在这个问题中看不到任何模式,我能想到的只是几个嵌套if/else块。我怎样才能做到这一点?谢谢。

4

2 回答 2

7

假设你有这个 String "B/R/G"。我会按照以下步骤订购它:

  • 在 上拆分字符串"/",得到一个数组:

    String str = "B/R/G";
    String[] arr = str.split("/");
    
  • 我会写我自己的比较器。但由于顺序不是自然顺序,我将使用字符串来获取所需的字符顺序:

    final String order = "GRBX";
    
  • 然后我将根据以下比较器对数组进行排序:

    Comparator<String> comparator = new Comparator<String>() {
        @Override
        public int compare(String s1, String s2) {
            // Get the index of both strings from the `order` string.
            // Lesser index means comes before.
            return order.indexOf(s1) - order.indexOf(s2);
        }
    };
    
    Arrays.sort(arr, comparator);
    
  • 然后我将再次加入数组元素"/",以获得最终的有序字符串。

您只需要确保,您不会拆分null字符串。

对于您给定的字符串,您将获得以下列表:

"B/R/G"  -> [G, R, B]
"R/G/B"  -> [G, R, B]
"G/B"    -> [G, B]
"B/X"    -> [B, X]
"G"      -> G
""       -> ""
null     -> // Handle this as required
于 2013-08-21T09:07:05.870 回答
1

我根本不会对字符串进行操作。相反,我会使用方法创建一个枚举和类toString。它不会让你对任何东西进行排序。

enum Something { R, G, B, X }

class Marks {

    private EnumSet<Soomething> markers = EnumSet.noneOf(Something.class);

    public void addSth(Something s) {
        markers.add(s);
    }

    public String toString() {
        if (markers.isEmpty())
            return "";
        ...
    }
}
于 2013-08-21T09:17:08.397 回答