Во-первых, вы должны использовать общие коллекции:
Map<Integer, List<Integer>> map = new LinkedHashMap<Integer, List<Integer>>();
Поскольку это выглядит как домашнее задание, я стараюсь давать подсказки, чтобы помочь вам вперед , а не полное решение. StackOverflow не должен писать домашнее задание для вас :-)
Вам нужны ключи от двух элементов для обмена. После этого вам просто нужно получить значения, соответствующие заданным ключам, и поменять их между двумя ключами. Затем добавьте случайную генерацию ключей - улучшение на @ общее решение Эяль в:
class MapSwapper1 {
private static Random rnd = new Random();
private static K[] nullArray = new K[0];
public static <K,V> void swapTwoRandomValues(Map<K,V> map){
if (map.size() <= 1)
throw new IllegalArgumentException("Not enough items");
//Choose 2 random positions pos1<pos2
int pos1 = 0, pos2 = 0;
while (pos1 == pos2) {
pos1 = rnd.nextInt(map.size());
pos2 = rnd.nextInt(map.size());
}
// Get the keys into an indexable array
K[] keys = map.keySet().toArray(nullArray);
swap(map, keys[pos1], keys[pos2]);
}
private static void <K,V> swap(Map<K, V> map, K key1, K key2) {
V tmp = map.get(key1);
map.put(key1, map.get(key2));
map.put(key2, tmp);
}
}
Я думаю, что это решение может быть быстрее, чем его даже, как это. Однако, если вы меняете значения внутри одной и той же карты много раз, не изменяя в противном случае карту (т. Е. Никакие ключи не добавляются, не удаляются или не изменяются на карте), вы можете дополнительно оптимизировать решение, повторно используя массив keys
между последующими вызовами свопинга:
class MapSwapper2<K, V> {
private Random rnd = new Random();
private Map<K,V> map;
private K[] keys;
public MapSwapper2(Map<K, V> map) {
resetKeys();
this.map = map;
}
public void resetKeys() {
if (map.size() <= 1)
throw new IllegalArgumentException("Not enough items");
keys = map.keySet().toArray(new K[0]);
}
public void swapTwoRandomValues() {
if (map.size() != keys.length)
resetKeys();
//Choose 2 random positions pos1<pos2
int pos1 = 0, pos2 = 0;
while (pos1 == pos2) {
pos1 = rnd.nextInt(map.size());
pos2 = rnd.nextInt(map.size());
}
swap(map, keys[pos1], keys[pos2]);
}
private void swap(K key1, K key2) {
V tmp = map.get(key1);
map.put(key1, map.get(key2));
map.put(key2, tmp);
}
}
Как вы видите, объекты MapSwapper2
связаны с конкретным экземпляром карты, элементы которого они могут повторно менять. Метод resetKeys
следует вызывать, если ключи карты изменены. Swapper может определить, изменился ли размер карты, но не, если, например, ключ удален и добавлен еще один ключ.
Это домашнее задание? –
nop Я работаю над проектом – Eddinho