如何以排序顺序将新字符添加到现有String?

ozb*_*bek 1 java sorting android

给出以下字符:"R","G","B"和"X".它们必须一次一个地添加到现有String的长度从0到5不等的长度.这个长度包括特殊字符/.即,现有字符串可能如下所示:

  • 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);
}
Run Code Online (Sandbox Code Playgroud)

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

Roh*_*ain 7

假设你有这个字符串"B/R/G".我会按照以下步骤来订购它:

  • 拆分String "/",得到一个数组:

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

    final String order = "GRBX";
    
    Run Code Online (Sandbox Code Playgroud)
  • 然后我将基于以下比较器对数组进行排序:

    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);
    
    Run Code Online (Sandbox Code Playgroud)
  • 然后我将再次加入数组元素"/",以获得最终排序的String.

你只需要确保,你不拆分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
Run Code Online (Sandbox Code Playgroud)