1 /**
2 * @(#)RandomIntegerList.java
3 * Copyright (C) 2008-2011 delhezi.com
4 *
5 * This class is released under the:
6 * GNU Lesser General Public License (LGPL) version 3 or later.
7 * http://www.gnu.org/copyleft/lesser.html
8 */
9 package com.delhezi.ga.utility;
10
11 import java.util.LinkedList;
12 import java.util.List;
13
14 /**
15 * Klasa <code>RandomIntegerList</code>: Losowanie wartości typu Integer,
16 * z zadanego przedziału (od 1 do size), bez powtórzeń.
17 *
18 * Rozwiązanie oparte na zbiorze uporządkowanym z dostępem po indeksie,
19 * z którego wylosowana wartość jest automatycznie usuwana.
20 * Po wylosowaniu elementu jest on usuwany ze zbioru i zwracany do
21 * wywołującego. Kolejne losowanie odbywa się z mniejszego zbioru.
22 * @version 1.0 2009-06-10
23 * @author <a href="mailto:wojciech.wolszczak@delhezi.com">
24 * Wojciech Wolszczak</a>
25 */
26 public class RandomUniqueInteger {
27
28 /** Lista liczb. */
29 private List<Integer> liczby;
30
31 /**
32 * Inicjacja obiektu.
33 * @since 1.0
34 */
35 private final void init(int size) {
36 // Tworzymy zbiór liczb.
37 liczby = new LinkedList<Integer>();
38 // Dodajemy kolejne liczby do zbioru.
39 for (int i = 1; i < size + 1; i++) {
40 liczby.add(new Integer(i));
41 }
42 }
43
44 /**
45 * Losowanie liczby z zakresu <1,size>.
46 * @return Liczba z zakresu <1,size>.
47 * @since 1.0
48 */
49 public final Integer get() {
50 Integer i = (int) (Math.random() * liczby.size());
51 i = liczby.get(i);
52 liczby.remove(i);
53 return i;
54 }
55
56 /**
57 * Wielkość zbioru.
58 * @return Wielkość zbioru.
59 * @since 1.0
60 */
61 public int getSize() {
62 return liczby.size();
63 }
64
65 /**
66 * Konstruktor.
67 * @param size Wielkość zbioru z którego losujemy elementy
68 * (zbiór będzie zawirał elementy 1 do size).
69 * @since 1.0
70 */
71 public RandomUniqueInteger(final int size) {
72 if (size <= 0) {
73 throw new IllegalArgumentException(
74 "Wielkość musi być większa od 0");
75 }
76 init(size);
77 }
78
79 }