2015-10-20 1 views
1

для второй записи idAndTags внутренняя карта перетасована, но не для первыхCollection.shuffle не работает над ключами карты или значениями карты. У меня есть карта внутри карты. Я хочу перетасовать карту, которая является самой внутренней:

ПЕРВЫЙ ПОДХОД!

for (Map.Entry<String, Map<String, String>> entryOne : idAndTags.entrySet()) { 

    List keys = new ArrayList(entryOne.getValue().keySet()); 
    System.out.println(keys); 
    Collections.shuffle(keys); 
    System.out.println(keys); 
} 

ВТОРОЙ ПОДХОД!

for (Map.Entry<String, Map<String, String>> entryOne : idAndTags.entrySet()) { 
    shufTags = new HashMap<String, String>(); 
    Map<String, String> tags = entryOne.getValue(); 
    System.out.println(tags); 
    final List<String> vs = new ArrayList<String>(tags.values()); 
    Collections.shuffle(vs); 
    final Iterator<String> vIter = vs.iterator(); 
    for (String k : tags.keySet()) 
     shufTags.put(k, vIter.next()); 
    System.out.println(shufTags); 
} 
+2

У «HashMap' есть ** нет порядка **. Никакое количество перетасовки и замены не убедит его иначе. –

+0

означает ли это, что java сама решает, что перетасовать и что не в HashMap? Я спрашиваю об этом, потому что для idAndTags внутренняя карта второй записи перетасовывается, но не первая –

+0

Заказ не определен. Любой заказ, который вы воспринимаете, является детальностью реализации. Существует даже никакой гарантии, что повторение дважды «Карты» приведет к тому, что _same_ order. –

ответ

0

не было выбора, решил, что так ... кажется, работает на меня!

Map<String, Map<String, String>> _idAndTagsShuffled = new HashMap<String, Map<String, String>>(); 
for (Map.Entry<String, Map<String, String>> entryOne : _idAndTags.entrySet()) { 
    ArrayList<String> keys = new ArrayList(entryOne.getValue().keySet()); 
    shuffledMap = new HashMap<String, String>(); 
    do { 
     shuffled = new ArrayList<String>(); 
     Collections.shuffle(keys); 
     for (String key : keys) { 
      shuffled.add(key); 
     } 
     int count = 0; 
     isShuffled = false; 
     for (String tag : entryOne.getValue().keySet()) { 
      if (!tag.equals(shuffled.get(count))) { 
       isShuffled = true; 
      } 
      count++; 
     } 
    } while (!isShuffled); 
    _idAndTagsShuffled.put(entryOne.getKey(), shuffledMap); 
} 
1

Map#.keySet() возвращает представление ключа набора, который не поддерживает порядок. Перетасовка не влияет на карту.

Вы не можете изменить порядок итерации HashMap, но через LinkedHashMap итерации себя в порядке вставки, так что вы можете заменить внутренние карты с LinkedHashMap и использовать перемешиваются набор ключей для привода вставки.

+0

Вы правы. Мне жаль, что я пропустил несколько строк кода в последнем посте. тем не менее, он отлично работает с этой логикой, которую я дал в «ответе», –