Регистрация  |  Вход

Рендомно назначаем записям в списке уникальный номер в диапазоне от 1 до (количество записей в списке)

нужно задать записям рендомный, но документированный порядок сортировки.

для этого на объекте есть специальное поле, которое будет содержать этот номер, который будет использован для сортировки. кроме того, пользователь может посмотреть на этот номер, чтоб понять почему список сортирован именно так и не иначе. то есть процесс "документирован"

как задать этот номер?

например, код кверит список из 10 записей. каждая запись должна получить рендомный номер от 1 до 10 (без повторов номера).

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

нужно задать записям рендомный, но документированный порядок сортировки.

для этого на объекте есть специальное поле, которое будет содержать этот номер, который будет использован для сортировки. кроме того, пользователь может посмотреть на этот номер, чтоб понять почему список сортирован именно так и не иначе. то есть процесс "документирован"

как  задать этот номер?

например, код кверит список из 10 записей. каждая запись должна получить рендомный номер от 1 до 10 (без повторов номера).

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

Что-то звучит как-то не очень понятно.

Вроде же сам ответил на свой вопрос

Den Brown
нужно задать записям рендомный, но документированный порядок сортировки.

для этого на объекте есть специальное поле, которое будет содержать этот номер, который будет использован для сортировки.

Поле к примеру Order. При insert записываем туда значение. Пользователь может как кверить по нему, а так же смотреть и изменять.

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

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

Ну или сделать поле НЕ уникальным и использовать комбинацию рандомного значения и сортировки по CreatedDate (или по Id) в пределах одинаковых значений.

Что-то звучит как-то не очень понятно.

Вроде же сам ответил на свой вопрос

[quote="Den Brown"]нужно задать записям рендомный, но документированный порядок сортировки.

для этого на объекте есть специальное поле, которое будет содержать этот номер, который будет использован для сортировки.[/quote]

Поле к примеру Order. При insert записываем туда значение. Пользователь может как кверить по нему, а так же смотреть и изменять.

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

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

Ну или сделать поле НЕ уникальным и использовать комбинацию рандомного значения и сортировки по CreatedDate (или по Id) в пределах одинаковых значений.

Я так понимаю, общий посыл в том, чтобы просто перемешать числа от 1 до 10 в массиве, а затем раскидать их на 10 записей.

List<Integer> ints = new List<Integer>{1,2,3,4,5,6,7,8,9,10};
System.debug( mixIntegers(ints) );

public static List<Integer> mixIntegers(List<Integer> intList){
if( intList == null ){
return null;
}
Integer intCount = intList.size();
List<Integer> randomIntegers = new List<Integer>();
Map<Double, Integer> randomMap = new Map<Double, Integer>();
Integer index = 0;
while( index != intCount ){
Double randomDouble = Math.random();
if(!randomMap.containsKey( randomDouble )){
randomMap.put( randomDouble, intList[index] );
index += 1;
}
}
List<Double> sortedRandoms = new List<Double>(randomMap.keySet());
sortedRandoms.sort();
for(Double d : sortedRandoms){
randomIntegers.add( randomMap.get(d) );
}
return randomIntegers;
}


Возможно можно и попроще это организовать)

Я так понимаю, общий посыл в том, чтобы просто перемешать числа от 1 до 10 в массиве, а затем раскидать их на 10 записей.[code]
List<Integer> ints = new List<Integer>{1,2,3,4,5,6,7,8,9,10};
System.debug( mixIntegers(ints) );

public static List<Integer> mixIntegers(List<Integer> intList){
	if( intList == null ){
		return null;
	}
	Integer intCount = intList.size();
	List<Integer> randomIntegers = new List<Integer>();
	Map<Double, Integer> randomMap = new Map<Double, Integer>();
	Integer index = 0;
	while( index != intCount ){
		Double randomDouble = Math.random();
		if(!randomMap.containsKey( randomDouble )){
			randomMap.put( randomDouble, intList[index] );
			index += 1;
		}		
	}
	List<Double> sortedRandoms = new List<Double>(randomMap.keySet());
	sortedRandoms.sort();
	for(Double d : sortedRandoms){
		randomIntegers.add( randomMap.get(d) );
	}
	return randomIntegers;
}
[/code]
Возможно можно и попроще это организовать)

Advega
Я так понимаю, общий посыл в том, чтобы просто перемешать числа от 1 до 10 в массиве

правильно, если упростить задачу, то вот это ее суть: перетасовать "колоду" с записями (или массив с числами) так чтобы они там оказались в рендомном порядке

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

вот тоже нашел:

https://blog.lkatney.com/2015/02/28/randomize-a-list-apex/

[quote="Advega"]Я так понимаю, общий посыл в том, чтобы просто перемешать числа от 1 до 10 в массиве[/quote]

правильно, если упростить задачу, то вот это ее суть: перетасовать "колоду" с записями (или массив с числами) так чтобы они там оказались в рендомном порядке 

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

вот тоже нашел:

https://blog.lkatney.com/2015/02/28/randomize-a-list-apex/