2013-08-21 2 views
1

Следующие символы: «R», «G», «B» и «X». Они должны быть добавлены каждый раз к существующему String, длина которого варьируется от 0 до 5. Эта длина включает специальный символ /. Т.е., существующая строка может выглядеть следующим образом:Как добавить новый символ в существующую строку в отсортированном порядке?

  • null
  • "" (пустая строка)
  • "Г"
  • "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 = новый ArrayList (); – andreich

+0

@andreich, как я буду сортировать этот 'listString'? :) – ozbek

+0

Collections.sort (listString); – andreich

ответ

7

Предположим, у вас есть эта строка "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 
+0

Молодец, я был о публикации того же солна;) – 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 ""; 
     ... 
    } 
} 
Смежные вопросы