Перейти к содержанию
Авторизация  
Urban

L2JS-DEV

Рекомендуемые сообщения

 

Интересно, первое что пришло в голову 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");

А где рандомное число удаления ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А где рандомное число удаления ?

		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)
			}
		}

Можно конечно перемешать но сути не должно изменить.

Изменено пользователем ncsSpawN

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
		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 штук, не в том порядке что в мапе записаны.

Изменено пользователем Mangol

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мешать нельзя. Я хочу 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");
Изменено пользователем ncsSpawN

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

Это же в каком законе такое прописано что перемешивать нельзя?

 

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. Четные, не четные.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

там их 300 штук, и все четные. Я хочу 100-250. Четные, не четные.

Так в чем проблема написать свой рандум идов для удаления?

Задача же была вроде как безопасное удаление с HeshMap списка, это можно сделать добавив нужные иды в keys.

А если нужен рандум то просто переписать условие if(keys.contains()) добавив рандум. Либо создать генератор рандума для keys.

Это уже дело фантазии.

Просто думал может есть какой ещё лучше метод удаления с хешмапа масив с идами, то было бы интересно посмотреть.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так в чем проблема написать свой рандум идов для удаления?

Задача же была вроде как безопасное удаление с HeshMap списка, это можно сделать добавив нужные иды в keys.

А если нужен рандум то просто переписать условие if(keys.contains()) добавив рандум. Либо создать генератор рандума для keys.

Это уже дело фантазии.

Просто думал может есть какой ещё лучше метод удаления с хешмапа масив с идами, то было бы интересно посмотреть.

 

Методов куча, но вот 100-250 я не увидел реализации. А вдруг что то изменится из-за этих 100-250

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Методов куча, но вот 100-250 я не увидел реализации. А вдруг что то изменится из-за этих 100-250

Ну накиньте пример, решим вашу задачу, можно сделать синхронизацию.

Чем к примеру не подойдет ConcurrentHashMap?

Методов то куча, но смотря какой из них в какой ситуации более эффективен и уместен будет.

Вот в чем вопрос.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дядьки, может хватит здесь пиписьками мериться? Создали бы уже себе тему в болталке, да там обсуждали бы Ваши полёты на марс и удаление там всяких четных лунатиков)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

там их 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));
	}

ac0659372ea36c7ab393a3146436.png

Изменено пользователем PointerRage
  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
	@[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));
	}

ac0659372ea36c7ab393a3146436.png

 

А как насчет того, а вдруг они будут повторятся ?

Размер большой, по всей видимости будут повторятся. Т.е. кол-во которое зарандомайзил рандом, снится на пару процентов.

 

http://prntscr.com/ga0ojg Реализация внутри ThreadLocalRandom

Изменено пользователем Mangol

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А как насчет того, а вдруг они будут повторятся ?

Размер большой, по всей видимости будут повторятся. Т.е. кол-во которое зарандомайзил рандом, снится на пару процентов.

 

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();
	}
Изменено пользователем PointerRage
  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно сделать более красиво - вывести суплир в отдельный класс, где и будет храниться сет уже сгенерированных псевдослучайным образом ключей, а стрим создавать через IntStream.generate

 

Вообще, кейс немного странный. Очень редко когда нужно удалить такое большое количество случайных элементов. В основном ключи для удаления всегда предопределены (получены по сети, из базы, от юзера и так далее).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно сделать более красиво - вывести суплир в отдельный класс, где и будет храниться сет уже сгенерированных псевдослучайным образом ключей, а стрим создавать через IntStream.generate

 

Вообще, кейс немного странный. Очень редко когда нужно удалить такое большое количество случайных элементов. В основном ключи для удаления всегда предопределены (получены по сети, из базы, от юзера и так далее).

Задача была взята из головы. Но ты единственный кто её решил, так как я задумал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Задача была взята из головы. Но ты единственный кто её решил, так как я задумал.

Запили тред что ли, можно будет порешать твои задачки, когда заняться нечем:) Может даже еще кто-нибудь присоединится к решению.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в конфигах настройки названия дб менять нужно:?

 

патч любой можно:?

Изменено пользователем Jackie

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в конфигах настройки названия дб менять нужно:?

 

патч любой можно:?

какие-то слишком примитивные вопросы, на мой взгляд. Патчи от 267 до 273, другие явно не подойдут Изменено пользователем Khrome
  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

при создании нового аккаунта пишет, что не верный логин или пароль как это исправить ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

при создании нового аккаунта пишет, что не верный логин или пароль как это исправить ?

авто регу выдать! 

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

авто регу выдать! 

 

 

Отличное решение)))

 авто рег был включен ) , уже понял ошибку просто пароль с символами нельзя делать ,спс

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

еще один вопрос ... если я с другом по локальной сети  запущу через 192.168 b т.д dsetup.dll который 127.0.0.1 не будет ругаться :? а то без dsetup.dll у меня вообще клиент не запускался

 

p.s я так понял это чистая сборка без нпс и т.д :?

Изменено пользователем Jackie

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

еще один вопрос ... если я с другом по локальной сети запущу через 192.168 b т.д dsetup.dll который 127.0.0.1 не будет ругаться :? а то без dsetup.dll у меня вообще клиент не запускался

 

p.s я так понял это чистая сборка без нпс и т.д :?

ага, и без нпс и баз итемов и без квестов, ваще без ничего

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

еще один вопрос ... если я с другом по локальной сети  запущу через 192.168 b т.д dsetup.dll который 127.0.0.1 не будет ругаться :? а то без dsetup.dll у меня вообще клиент не запускался

 

p.s я так понял это чистая сборка без нпс и т.д :?

нет там всё есть)))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ага, и без нпс и баз итемов и без квестов, ваще без ничего

зачем же так грубо( 

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...