2013-08-21 54 views
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塊。我怎樣才能做到這一點?謝謝。

+0

嘗試使用列表 listString = new ArrayList (); – andreich

+0

@andreich,那麼我將如何對那個'listString'進行排序呢? :) – ozbek

+0

Collections.sort(listString); – andreich

回答

7

假設你有這個字符串"B/R/G"。我會按照下面的步驟來訂購吧:

  • 分割字符串上"/",獲取數組:

    String str = "B/R/G"; 
    String[] arr = str.split("/"); 
    
  • 我會寫我自己的比較。但由於訂單是不是一個自然的順序,我將使用一個字符串的字符獲得所需要的順序:

    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); 
    
  • final String order = "GRBX"; 
    
  • 然後,我將基於以下比較數組排序

  • 然後我將再次加入數組元素"/",以獲得最終的有序字符串。

你只需要確保,你不拆一個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 
+0

幹得好,我是在發佈相同的soln;) – sp00m

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 ""; 
     ... 
    } 
} 
相關問題