View Javadoc
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  }