Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.05.2010, 17:27
Профессор
Отправить личное сообщение для exec Посмотреть профиль Найти все сообщения от exec
 
Регистрация: 21.01.2010
Сообщений: 1,022

Сделать все элементы массива уникальными
Есть массив с 10 элементами, содержащими числа от 0 до 20. Надо сделать так, чтобы не было одинаковых элементов, чтобы они заменились на любое другое число (от 0 до 20). Ума не приложу, как это сделать.

Готовый код не нужен, просто подкиньте алгоритм, как это всё организовать.
Ответить с цитированием
  #2 (permalink)  
Старый 28.05.2010, 17:40
Аватар для micscr
Профессор
Отправить личное сообщение для micscr Посмотреть профиль Найти все сообщения от micscr
 
Регистрация: 10.09.2009
Сообщений: 1,571

Код:
WhoIs = {}
цикл по элементам
  if (WhoIs[текущее значение]) меняем на уникальное и обновляем WhoIs.
  WhoIs[текущее значение] = 'занято';
end цикл по элементам
меняем на уникальное - с помощью отдельной функции - она его найдет учитывая WhoIs
Ответить с цитированием
  #3 (permalink)  
Старый 29.05.2010, 14:20
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,085

а если сразу формировать массив с уникальными элементами ? чтоб его потом не проверять на повторы
Ответить с цитированием
  #4 (permalink)  
Старый 29.05.2010, 14:43
Профессор
Отправить личное сообщение для exec Посмотреть профиль Найти все сообщения от exec
 
Регистрация: 21.01.2010
Сообщений: 1,022

рони, тогда массив станет меньше. А если добавить в него рандомное число, оно может совпасть с каким-нибудь оставшимся в массиве числом.

micscr, а причём тут хэш?
Ответить с цитированием
  #5 (permalink)  
Старый 29.05.2010, 14:46
Аватар для micscr
Профессор
Отправить личное сообщение для micscr Посмотреть профиль Найти все сообщения от micscr
 
Регистрация: 10.09.2009
Сообщений: 1,571

Сообщение от exec Посмотреть сообщение
micscr, а причём тут хэш?
что за хэш ?
Ответить с цитированием
  #6 (permalink)  
Старый 29.05.2010, 14:52
Профессор
Отправить личное сообщение для exec Посмотреть профиль Найти все сообщения от exec
 
Регистрация: 21.01.2010
Сообщений: 1,022

Цитата:
WhoIs = {}
Вот.
Ответить с цитированием
  #7 (permalink)  
Старый 29.05.2010, 14:54
Профессор
Отправить личное сообщение для exec Посмотреть профиль Найти все сообщения от exec
 
Регистрация: 21.01.2010
Сообщений: 1,022

-------------

Есть вариант — напустить на массив array_unique, потом, пока массив не примет прежний размер, добавлять в него рандомные числа, предварительно проверяя, не нахоятся ли они уже внутри него. Но порядок чисел должен сохраняться, поэтому это не подходит.
Ответить с цитированием
  #8 (permalink)  
Старый 29.05.2010, 15:10
Аватар для micscr
Профессор
Отправить личное сообщение для micscr Посмотреть профиль Найти все сообщения от micscr
 
Регистрация: 10.09.2009
Сообщений: 1,571

Сообщение от exec Посмотреть сообщение
Вот.
это вспомогательный объект - в его свойствах будут содержаться уже присутствующие элементы.
Ответить с цитированием
  #9 (permalink)  
Старый 29.05.2010, 15:23
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,085

функция формирования массива с уникальными данными с заданной длиной и диапазоном
<script language="JavaScript" type="text/javascript">
function random(min,max,l)
{var arr = [],m = [],n = 0;
  if (max - min < l-1) return;
  for (var i=0; i<=(max-min); i++)m[i] = i + min;
  for (var i=0; i<l; i++) {n = Math.floor(Math.random()*(m.length)); arr[i]=m.splice(n,1)[0];};
  return arr
}
document.write(JSON.stringify(random(0,20,10)))
</script>

Последний раз редактировалось рони, 12.04.2015 в 13:03.
Ответить с цитированием
  #10 (permalink)  
Старый 29.05.2010, 15:24
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,085

вариант отлова на скорую руку
<script language="JavaScript" type="text/javascript">
function usefloor(min, max) {
    return Math.floor(Math.random() * (max - min + 1) + min);
}
var m = [],
    s = [],
    t = [];
var l = 10; //длина массива
var min = 0;
var max = 20;
//создание массива m с неуникальными элементами
for (var i = 0; i < l; i++) {
    m[i] = usefloor(min, max)
}
var test="<br>" + m;
//создание массива t из оставшихся элементов на случай замены
for (var i = 0; i <= (max - min); i++) {
    s[i] = 1;
}
for (var i = 0; i < l; i++) {
    s[m[i]] = 0;
}
for (var i = 0; i < s.length; i++) {
    if (s[i] == 1) t.push(i)
}
test+="<br>" + t;
//проверка m на уникальность и замена повторяющихся элементов
for (var i = 0; i < l; i++) {
    for (var k = i + 1; k < l; k++) {
        if (m[k] == m[i]) {
            n = usefloor(0, (t.length - 1));
            m[k] = "<font color='#FF0000'>" + t[n] + "</font>";
            t.splice(n, 1);
        }
    }
}
document.write(test+"<br>" + m);
</script>

Последний раз редактировалось рони, 16.06.2010 в 05:59.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сделать элементы формы недоступными Compas Общие вопросы Javascript 4 06.10.2012 21:59
Пустые элементы массива lammeR Общие вопросы Javascript 5 25.05.2010 02:59
Как удалить повторные элементы из массива? YISHIMITSY Общие вопросы Javascript 1 04.05.2010 00:04
Выбрать все элементы кроме $(this) shustrikk jQuery 2 13.03.2010 14:17
глюк форума Gvozd Сайт Javascript.ru 11 18.03.2009 14:37