Mangol 101 Опубликовано 18 августа, 2017 Интересно, первое что пришло в голову Iterator+HashMap или ConcurrentHashMap если не прав то поправьте: int counts = 600; HashMap<Integer, String> map = new HashMap<Integer, String>(); ConcurrentHashMap<Integer, String> conmap = new ConcurrentHashMap<Integer, String>(); ArrayList<Integer> keys = new ArrayList<Integer>(); for(int i=1;i<=counts;i++) { map.put(i,"Текст "+i); conmap.put(i,"Текст "+i); if((i%2)==0) //все четные числа до counts { keys.add(i); } } //HashMap long start_time = new GregorianCalendar().getTimeInMillis(); for(Iterator<Map.Entry<Integer, String>> it = map.entrySet().iterator(); it.hasNext(); ) { Map.Entry<Integer, String> entry = it.next(); if(keys.contains(entry.getKey())) { it.remove(); } } long finish_time = new GregorianCalendar().getTimeInMillis(); System.out.println("Time HashMap: "+(finish_time - start_time)+"ms "+ map.size()+ "size"); //ConcurrentHashMap start_time = new GregorianCalendar().getTimeInMillis(); for(Map.Entry<Integer, String> it : conmap.entrySet()) { if(keys.contains(it.getKey())) { conmap.remove(it.getKey()); } } finish_time = new GregorianCalendar().getTimeInMillis(); System.out.println("Time ConcurrentHashMap: "+(finish_time - start_time)+"ms "+ conmap.size()+ "size"); А где рандомное число удаления ? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
ncsSpawN 45 Опубликовано 18 августа, 2017 (изменено) А где рандомное число удаления ? int counts = 600; ArrayList<Integer> keys = new ArrayList<Integer>(); //список идов for(int i=1;i<=counts;i++) { if((i%2)==0) //все четные числа до counts { keys.add(i); //тут будет список только четных чисел 2,4,6,8,10,12 и ... 596,598,600 (размер 300) } } Можно конечно перемешать но сути не должно изменить. Изменено 18 августа, 2017 пользователем ncsSpawN Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Mangol 101 Опубликовано 18 августа, 2017 (изменено) int counts = 600; ArrayList<Integer> keys = new ArrayList<Integer>(); //список идов for(int i=1;i<=counts;i++) { if((i%2)==0) //все четные числа до counts { keys.add(i); //тут будет список только четных чисел 2,4,6,8,10,12 и ... 596,598,600 (размер 300) } } Можно конечно перемешать но сути не должно изменить. Мешать нельзя. Я хочу 100-250 штук, не в том порядке что в мапе записаны. Изменено 18 августа, 2017 пользователем Mangol Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
ncsSpawN 45 Опубликовано 18 августа, 2017 (изменено) Мешать нельзя. Я хочу 100-250 штук, не в том порядке что в мапе записаны. Это же в каком законе такое прописано что перемешивать нельзя? Collections.shuffle(keys); //мешаем наш список идов В итоге мы просто переберем весь список(map) и сравним каждый ид с тем что есть в списке(keys) идов игроков. А затем удалим нужные иды со списка (map), но это не чего не изменит так как мы все равно сравниваем через keys.contains() весь список map. Так что в любом случаи если перемешать map или keys то мы получим тотже самый результат. Будут удалены со списка map игроки с идами со списка keys. int counts = 600; HashMap<Integer, String> map = new HashMap<Integer, String>(); ConcurrentHashMap<Integer, String> conmap = new ConcurrentHashMap<Integer, String>(); ArrayList<Integer> keys = new ArrayList<Integer>(); for(int i=1;i<=counts;i++) { map.put(i,"Текст "+i); conmap.put(i,"Текст "+i); if((i%2)==0) //все четные числа до counts { keys.add(i); } } //Перемешиваем Collections.shuffle(keys); //HashMap long start_time = new GregorianCalendar().getTimeInMillis(); for(Iterator<Map.Entry<Integer, String>> it = map.entrySet().iterator(); it.hasNext(); ) { Map.Entry<Integer, String> entry = it.next(); if(keys.contains(entry.getKey())) { it.remove(); } } long finish_time = new GregorianCalendar().getTimeInMillis(); System.out.println("Time HashMap: "+(finish_time - start_time)+"ms "+ map.size()+ "size"); //ConcurrentHashMap start_time = new GregorianCalendar().getTimeInMillis(); for(Map.Entry<Integer, String> it : conmap.entrySet()) { if(keys.contains(it.getKey())) { conmap.remove(it.getKey()); } } finish_time = new GregorianCalendar().getTimeInMillis(); System.out.println("Time ConcurrentHashMap: "+(finish_time - start_time)+"ms "+ conmap.size()+ "size"); Изменено 18 августа, 2017 пользователем ncsSpawN Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Mangol 101 Опубликовано 18 августа, 2017 Это же в каком законе такое прописано что перемешивать нельзя? Collections.shuffle(keys); //мешаем наш список идов В итоге мы просто переберем весь список(map) и сравним каждый ид с тем что есть в списке(keys) идов игроков. А затем удалим нужные иды со списка (map) int counts = 600; HashMap<Integer, String> map = new HashMap<Integer, String>(); ConcurrentHashMap<Integer, String> conmap = new ConcurrentHashMap<Integer, String>(); ArrayList<Integer> keys = new ArrayList<Integer>(); for(int i=1;i<=counts;i++) { map.put(i,"Текст "+i); conmap.put(i,"Текст "+i); if((i%2)==0) //все четные числа до counts { keys.add(i); } } //Перемешиваем Collections.shuffle(keys); //HashMap long start_time = new GregorianCalendar().getTimeInMillis(); for(Iterator<Map.Entry<Integer, String>> it = map.entrySet().iterator(); it.hasNext(); ) { Map.Entry<Integer, String> entry = it.next(); if(keys.contains(entry.getKey())) { it.remove(); } } long finish_time = new GregorianCalendar().getTimeInMillis(); System.out.println("Time HashMap: "+(finish_time - start_time)+"ms "+ map.size()+ "size"); //ConcurrentHashMap start_time = new GregorianCalendar().getTimeInMillis(); for(Map.Entry<Integer, String> it : conmap.entrySet()) { if(keys.contains(it.getKey())) { conmap.remove(it.getKey()); } } finish_time = new GregorianCalendar().getTimeInMillis(); System.out.println("Time ConcurrentHashMap: "+(finish_time - start_time)+"ms "+ conmap.size()+ "size"); там их 300 штук, и все четные. Я хочу 100-250. Четные, не четные. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
ncsSpawN 45 Опубликовано 18 августа, 2017 там их 300 штук, и все четные. Я хочу 100-250. Четные, не четные. Так в чем проблема написать свой рандум идов для удаления? Задача же была вроде как безопасное удаление с HeshMap списка, это можно сделать добавив нужные иды в keys. А если нужен рандум то просто переписать условие if(keys.contains()) добавив рандум. Либо создать генератор рандума для keys. Это уже дело фантазии. Просто думал может есть какой ещё лучше метод удаления с хешмапа масив с идами, то было бы интересно посмотреть. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Mangol 101 Опубликовано 18 августа, 2017 Так в чем проблема написать свой рандум идов для удаления? Задача же была вроде как безопасное удаление с HeshMap списка, это можно сделать добавив нужные иды в keys. А если нужен рандум то просто переписать условие if(keys.contains()) добавив рандум. Либо создать генератор рандума для keys. Это уже дело фантазии. Просто думал может есть какой ещё лучше метод удаления с хешмапа масив с идами, то было бы интересно посмотреть. Методов куча, но вот 100-250 я не увидел реализации. А вдруг что то изменится из-за этих 100-250 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
ncsSpawN 45 Опубликовано 18 августа, 2017 Методов куча, но вот 100-250 я не увидел реализации. А вдруг что то изменится из-за этих 100-250 Ну накиньте пример, решим вашу задачу, можно сделать синхронизацию. Чем к примеру не подойдет ConcurrentHashMap? Методов то куча, но смотря какой из них в какой ситуации более эффективен и уместен будет. Вот в чем вопрос. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Hotaka 769 Опубликовано 18 августа, 2017 Дядьки, может хватит здесь пиписьками мериться? Создали бы уже себе тему в болталке, да там обсуждали бы Ваши полёты на марс и удаление там всяких четных лунатиков) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
PointerRage 132 Опубликовано 18 августа, 2017 (изменено) там их 300 штук, и все четные. Я хочу 100-250. Четные, не четные. @[member='test'] public void testMangolDelete() { final Object value = new Object(); final Map<Integer, Object> map = IntStream.range(0, 1000).boxed().collect(Collectors.toMap(k -> k, k -> value)); ThreadLocalRandom.current().ints(ThreadLocalRandom.current().nextInt(100, 250), 0, map.size()) .forEach(v -> map.remove(v)); } Изменено 18 августа, 2017 пользователем PointerRage 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Mangol 101 Опубликовано 18 августа, 2017 (изменено) @[member='test'] public void testMangolDelete() { final Object value = new Object(); final Map<Integer, Object> map = IntStream.range(0, 1000).boxed().collect(Collectors.toMap(k -> k, k -> value)); ThreadLocalRandom.current().ints(ThreadLocalRandom.current().nextInt(100, 250), 0, map.size()) .forEach(v -> map.remove(v)); } А как насчет того, а вдруг они будут повторятся ? Размер большой, по всей видимости будут повторятся. Т.е. кол-во которое зарандомайзил рандом, снится на пару процентов. http://prntscr.com/ga0ojg Реализация внутри ThreadLocalRandom Изменено 18 августа, 2017 пользователем Mangol Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
PointerRage 132 Опубликовано 18 августа, 2017 (изменено) А как насчет того, а вдруг они будут повторятся ? Размер большой, по всей видимости будут повторятся. Т.е. кол-во которое зарандомайзил рандом, снится на пару процентов. http://prntscr.com/ga0ojg Реализация внутри ThreadLocalRandom @DataPoints public final static int[] counts = { 1, 5, 17, 59 }; @Theory public void testMangolDeleteFewTimes(int count) { for(int i = 0; i < count; i++) { testMangolDelete(); } } private void testMangolDelete() { final Object value = new Object(); final Map<Integer, Object> map = IntStream.range(0, 1000).boxed().collect(Collectors.toMap(k -> k, k -> value)); generate(ThreadLocalRandom.current().nextInt(100, 250), 0, map.size()) .forEach(v -> Assert.assertTrue(map.remove(v) != null)); } private IntStream generate(int count, int min, int max) { final Set<Integer> set = new HashSet<>(); final IntStream.Builder builder = IntStream.builder(); for(int i = 0; i < count; i++) { for(int value = ThreadLocalRandom.current().nextInt(min, max);; value = ThreadLocalRandom.current().nextInt(min, max)) { if(set.add(value)) { builder.accept(value); break; } } } return builder.build(); } Изменено 18 августа, 2017 пользователем PointerRage 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
PointerRage 132 Опубликовано 18 августа, 2017 Можно сделать более красиво - вывести суплир в отдельный класс, где и будет храниться сет уже сгенерированных псевдослучайным образом ключей, а стрим создавать через IntStream.generate Вообще, кейс немного странный. Очень редко когда нужно удалить такое большое количество случайных элементов. В основном ключи для удаления всегда предопределены (получены по сети, из базы, от юзера и так далее). Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Mangol 101 Опубликовано 18 августа, 2017 Можно сделать более красиво - вывести суплир в отдельный класс, где и будет храниться сет уже сгенерированных псевдослучайным образом ключей, а стрим создавать через IntStream.generate Вообще, кейс немного странный. Очень редко когда нужно удалить такое большое количество случайных элементов. В основном ключи для удаления всегда предопределены (получены по сети, из базы, от юзера и так далее). Задача была взята из головы. Но ты единственный кто её решил, так как я задумал. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
PointerRage 132 Опубликовано 18 августа, 2017 Задача была взята из головы. Но ты единственный кто её решил, так как я задумал. Запили тред что ли, можно будет порешать твои задачки, когда заняться нечем Может даже еще кто-нибудь присоединится к решению. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Jackie 2 Опубликовано 20 августа, 2017 (изменено) в конфигах настройки названия дб менять нужно:? патч любой можно:? Изменено 20 августа, 2017 пользователем Jackie Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Khrome 276 Опубликовано 20 августа, 2017 (изменено) в конфигах настройки названия дб менять нужно:? патч любой можно:? какие-то слишком примитивные вопросы, на мой взгляд. Патчи от 267 до 273, другие явно не подойдут Изменено 20 августа, 2017 пользователем Khrome 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Jackie 2 Опубликовано 20 августа, 2017 при создании нового аккаунта пишет, что не верный логин или пароль как это исправить ? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Urban 78 Опубликовано 20 августа, 2017 при создании нового аккаунта пишет, что не верный логин или пароль как это исправить ? авто регу выдать! 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Heartless 60 Опубликовано 20 августа, 2017 авто регу выдать! Отличное решение))) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Jackie 2 Опубликовано 20 августа, 2017 авто регу выдать! Отличное решение))) авто рег был включен ) , уже понял ошибку просто пароль с символами нельзя делать ,спс Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Jackie 2 Опубликовано 20 августа, 2017 (изменено) еще один вопрос ... если я с другом по локальной сети запущу через 192.168 b т.д dsetup.dll который 127.0.0.1 не будет ругаться :? а то без dsetup.dll у меня вообще клиент не запускался p.s я так понял это чистая сборка без нпс и т.д :? Изменено 20 августа, 2017 пользователем Jackie Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Khrome 276 Опубликовано 20 августа, 2017 еще один вопрос ... если я с другом по локальной сети запущу через 192.168 b т.д dsetup.dll который 127.0.0.1 не будет ругаться :? а то без dsetup.dll у меня вообще клиент не запускался p.s я так понял это чистая сборка без нпс и т.д :? ага, и без нпс и баз итемов и без квестов, ваще без ничего Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Urban 78 Опубликовано 20 августа, 2017 еще один вопрос ... если я с другом по локальной сети запущу через 192.168 b т.д dsetup.dll который 127.0.0.1 не будет ругаться :? а то без dsetup.dll у меня вообще клиент не запускался p.s я так понял это чистая сборка без нпс и т.д :? нет там всё есть))) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Urban 78 Опубликовано 20 августа, 2017 ага, и без нпс и баз итемов и без квестов, ваще без ничего зачем же так грубо( 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты