2016-08-27 3 views
-1

У меня есть LinkedList, хранящийся в форме [1a,1b,2a,2b,3a,3b, etc.], и я хотел бы перетасовать его так, чтобы #a и #b остались вместе. Я знаю, что вы можете создать объект, который содержит как #a, так и #b, затем перетасовать LinkedList из этих объектов, но мне было интересно, есть ли более удобный способ сделать это.Перетасовка LinkedList при сохранении структуры

Благодарим за помощь!

+1

Существует более * неудобный * способ сделать это вручную. – Kayaman

+0

, пожалуйста, добавьте в свой вопрос, каков будет конечный результат. –

+2

Нет, то, что вы предложили, является наиболее удобным способом. Если вы хотите использовать ['Collections.shuffle()'] (https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#shuffle-java.util.List-) (* на самом деле * наиболее удобный способ), и вы хотите сохранить «1a» и «1b» вместе, тогда вам нужен объект значений для хранения и перетасовки этих объектов. – Andreas

ответ

0

Использование Java 8 потоков может быть наиболее удобным способом.

Вот пример кода, запустите 10 раз, чтобы увидеть эффект shuffle().

List<String> input = Arrays.asList("1a","1b","2a","2b","3a","3b"); 
for (int i = 0; i < 10; i++) { 
    List<List<String>> tmp = new ArrayList<>(input.stream() 
      .collect(Collectors.groupingBy(s -> s.substring(0,1))) 
      .values()); 
    Collections.shuffle(tmp); 
    LinkedList<String> output = tmp.stream() 
      .flatMap(List::stream) 
      .collect(Collectors.toCollection(LinkedList::new)); 
    System.out.println("\t" + output); 
} 

Выход

[1a, 1b, 2a, 2b, 3a, 3b] 
[2a, 2b, 3a, 3b, 1a, 1b] 
[3a, 3b, 1a, 1b, 2a, 2b] 
[1a, 1b, 2a, 2b, 3a, 3b] 
[3a, 3b, 1a, 1b, 2a, 2b] 
[1a, 1b, 2a, 2b, 3a, 3b] 
[2a, 2b, 3a, 3b, 1a, 1b] 
[3a, 3b, 2a, 2b, 1a, 1b] 
[1a, 1b, 2a, 2b, 3a, 3b] 
[1a, 1b, 3a, 3b, 2a, 2b] 
0

Да есть. Вы используете слово «shuffle» для фактического сортировки записей #a и #b вместе. Если мое предположение верно, вы можете достичь этого, используя java.util.Collections.sort(), чтобы вы могли передать свой собственный класс реализации Comparator для сортировки. Один из таких примеров того, как вы могли его достичь, приведен ниже.

class LinkedListSort{ 

    public static void main(String[] args) 
    { 
     LinkedList<String> list = new LinkedList<String>(); 
     String linkedListDataString = "1a,1b,2a,2b,3a,3b"; 
     for(String str : linkedListDataString.split(",")) { 
      list.add(str); 
     } 

     Collections.sort(list, new Comparator<String>() { 
      @Override 
      public int compare(String object1, String object2) { 
       String suffix1 = object1.substring(object1.length()-1); 
       String suffix2 = object2.substring(object2.length()-1); 

       return Collator.getInstance().compare(suffix1,suffix2); 
      } 
     }); 
     System.out.println("Sorted list entries: "); 
     for(String e:list) { 
     System.out.println(e); 
     } 
    } 
} 
Смежные вопросы