2012-02-28 1 views
0

Я создаю генератор случайных чисел в Java как часть программы, которую я пишу, чтобы лучше изучить язык (исходят из большего количества фона C#/C++).Случайный массив чисел в Java - хочу сортировать по возрастанию

ArrayList<Integer> al = new ArrayList<Integer>(); 
    Random ran = new Random(); 
    for(int i = 1; i <= 11; i++) 
     al.add(i); 


    for(int i = 0; i < 2; i++) 
    { 
     ArrayList<Integer> temp = new ArrayList<Integer>(); 
     int num = al.remove(ran.nextInt(al.size())); 

     temp.add(num); 
     Arrays.sort(temp); 

     text("\Random Number " + i + " is: " + temp[i]); 
    } 

На Arrays.sort (темп) Я не получаю сообщение об ошибке не подходящего метода и в моей функции выхода текста я получаю требуется массив, но java.util.ArrayList нашел. Может ли кто-нибудь предложить лучший способ отсортировать этот массив случайных чисел в порядке возрастания или увидеть что-то, что я делаю неправильно в настоящее время, что можно легко исправить? Благодарю.

ответ

4

Использование Collections.sort(temp).

В Java массивы и списки - это два разных зверя. Arrays.sort() работает только для массивов; эквивалентная функция для списков - Collections.sort().

Не могу сказать, что я полностью понимаю логику вашего кода, но вы также можете взглянуть на Collections.shuffle().

редактировать При ближайшем рассмотрении, есть и другие проблемы с кодом:

  1. Вы Воссоздание temp с нуля, так что на каждой итерации цикла она будет содержать ровно один элемент.
  2. temp[i] недействителен синтаксически; правильный синтаксис - temp.get(i). Даже с правильным синтаксисом он даст вам исключение «за пределами», поскольку temp содержит только один элемент.
+0

Большое спасибо - это то, что вы получаете, когда вы сначала просматриваете сортировку массива в Java на Google. :) Я также посмотрю на collection.shuffle. Что касается выходной строки после изменения в Collections.Sort (temp); могу ли я распечатать строку с индексом temp [i]? –

+0

@KOL: Правильный синтаксис - 'temp.get (i)'.См. Обновленный ответ. – NPE

+0

Приветствия - принятый ответ. –

3

При сортировке ArrayList следует использовать:

Collections.sort(); 

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

TreeSet<Integer> randomSet = new TreeSet<Integer>(); 
Random ran = new Random(); 
while(randomSet.size() < 3) { 
    randomSet.add(Math.abs(ran.nextInt()) % 11 + 1); //+1 to adjust your range [1..11] 
} 

for (int i : randomSet) 
    System.out.println(i); 

Math.abs() гарантия того, что вы будете иметь только положительные числа, и вы можете использовать% оператора, чтобы установить максимальное значение.

Более подробная информация о оном взяла из гадательных документов:

Если этот набор уже содержит элемент, вызов оставляет набор без изменений и возвращает ложь.

+0

Спасибо за эту дополнительную логику. Я хочу 2 случайных числа, сгенерированных в диапазоне 1-11. Итак, из вашего комментария% должно иметь 11 после него и цикл for <= 3, чтобы сгенерировать 3 числа? Единственное, что у меня есть, это то, что я не хочу дублировать случайные числа (т. Е. Если 3 выйдет в следующий раз, его не следует выбирать. –

+1

проверить мой новый ответ, см., Если это сработает для вас. – deantoni

+0

Это было очень полезно - спасибо - можете ли вы объяснить немного больше о том, как работает% 11 + 1, то есть, почему нужно добавить +1, и если бы я был моим диапазоном, мне было бы не нужно, чтобы я + 1 правильно? Это то же самое, что и modulo operator в C++? спасибо –

0

Он будет делать:

Collections.sort(); 
1

Вы можете использовать Collection класс для Сортировка ArrayList:

ArrayList<Integer> al =new ArrayList<Integer>(); 

Collections.sort(al , new Comparator<Integer>() 
{ 
    public int compare(Integer a, Integer b) { 
    return a.compareTo(b) ; 
    } 
}); 

Так что теперь al имеет упорядоченный список.

Смежные вопросы