2016-12-16 4 views
0

У меня есть пара ArrayList:Преобразования два ArrayList

ArrayList а -> [ "52", "52", "52", "52", "67", "67", «67», «67»]

ArrayList b -> ["1", "4", "5", "6", "3", "4", "5", "10"]

Я хочу, чтобы превратить их в:

ArrayList в -> [ "52", "52", "67", "67"]

ArrayList Ь -> [ "1" , "4 - 6", "3 - 5", "1 0 "]

Я знаю, как сделать b в bt, но я не могу обмотать голову, чтобы вставить в.

Алгоритм Построения для изготовления б в BT:

public static void main(String[] args) { 

    ArrayList<String> alist = new ArrayList<String>(); 
    alist.add("1"); 
    alist.add("4"); 
    alist.add("5"); 
    alist.add("6"); 
    alist.add("3"); 
    alist.add("4"); 
    alist.add("5");  
    alist.add("10"); 

    alist = groupByRange(alist); 

} 

static public ArrayList<String> groupByRange(ArrayList<String> alist) { 

    // ArrayList<String> to ArrayList<Integer> 
    ///////////////////////////////////////////////////////// 

    ArrayList<Integer> alist_int = new ArrayList<Integer>(); 
    for (String ident : alist) { 
     alist_int.add(Integer.parseInt(ident)); 
    } 

    // ArrayList<Integer> to int[] 
    ///////////////////////////////////////////////////////// 

    int[] arr = new int[alist_int.size()]; 

    for (int i = 0; i < arr.length; i++) { 
     arr[i] = alist_int.get(i); 
    } 

    // Grouping by range (return ArrayList<String>) 
    ///////////////////////////////////////////////////////// 

    int start, end; 
    end = start = arr[0]; 
    ArrayList<String> alist_res = new ArrayList<String>(); 
    for (int i = 1; i < arr.length; i++) { 
     if (arr[i] == (arr[i - 1] + 1)) { 
      end = arr[i]; 
     } else { 

      if (start == end) { 
       alist_res.add(String.valueOf(start)); 
      } else { 
       alist_res.add(String.valueOf(start) + " - " + String.valueOf(end)); 
      } 
      start = end = arr[i]; 
     } 
    } 

    if (start == end) { 
     alist_res.add(String.valueOf(start)); 
    } else { 
     alist_res.add(String.valueOf(start) + " - " + String.valueOf(end)); 
    } 

    for (String n : alist_res) { 
     System.out.println(n); 
    } 

    return alist_res; 
} 
+5

Дело в том, что для того, чтобы закодировать что-либо, вам сначала нужно ** ясности ** о ваших требованиях. Например: каково правило, которое говорит вам, что (52,52,52,52) следует уменьшить до (52,52)? Правило ли правило: только два раза один и тот же номер подряд? Или: уменьшить дубликаты только до двух случаев? Я имею в виду: сначала нужно ** четко указать ** правила ** для ваших преобразований. И тогда вы начинаете думать о «как». Внедрение неясных правил может привести только к путанице и нищете. – GhostCat

+1

Тогда, пожалуйста, ИЗМЕНИТЕ вопрос; не начинайте вкладывать вещи в комментарии! – GhostCat

+0

Я надеялся, что это было ясно в моем примере, но вы правы. Я попытаюсь объяснить: 52 ассоциируется с 1, 4, 5 и 6; то же, что и 67, связано с 3, 4, 5 и 10. Вот почему мне нужно (52) -> (1), (52) -> (4-6), (67) -> (3- 5) и (67) -> (10) –

ответ

0

У меня есть метод для вас:

public List<String> groupByValue(List<String> listA) { 

    if (listA.isEmpty()) { 
     return Collections.emptyList(); 
    } 

    final List<String> result = new ArrayList<>(); 
    result.add(listA.get(0)); 

    for (int actualIndex = 1; actualIndex < listA.size(); actualIndex++) { 
     if (actualIndex + 1 < listA.size() - 1 && !listA.get(actualIndex + 1).equals(listA.get(actualIndex))) { 
      result.add(listA.get(actualIndex)); 
      actualIndex++; 
     } 
     if (actualIndex < listA.size() - 1 && !listA.get(actualIndex - 1).equals(listA.get(actualIndex))) { 
      result.add(listA.get(actualIndex)); 
     } 
     if (actualIndex + 1 == listA.size()) { 
      result.add(listA.get(actualIndex)); 
     } 
    } 

    return result; 
} 

Этот метод имеет один параметр, это Ваш список ввести. Затем список chcek, а затем добавим первое значение из списка. Затем мы проверяем следующие значения, и результат получается в конце, это означает, что в списке.

+0

Это не работает. Метод должен иметь 2 параметра (a и b), так как размер массива bt равен at. Я протестировал его, и он не будет работать так. Спасибо, в любом случае. –

+0

Хорошо, может быть, вы можете дать более подробную информацию о том, как этот метод должен работать? подробнее о параметрах? Подробнее о спецификации? – MateuszW90

+0

Я не думаю, что это необходимо. Проблема проста, но, боюсь, я не сделал это очень ясно. Извини за это. Я скоро отредактирую главный пост. –

Смежные вопросы