Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Java] Структура данных


Автор: kornata 25.4.2010, 21:42
Помогите выполнить задание:

Создайте generic структуру данных, позволяющую тянуть жребий и исключающую возможность подглядывания. Она должна предоставлять возможность добавить несколько элементов и затем в случайном порядке их извлечь. Для хранения элементов используйте массив, реализуйте по крайней мере интерфейс Iterable, при этом итератор тоже должен возвращать элементы в случайном порядке и сразу их удалять. 

Автор: kornata 6.5.2010, 16:40
Помогите, кто-нибудь... smile 

Автор: LSD 7.5.2010, 18:15
Код

import java.util.Arrays;
import java.util.Iterator;
import java.util.Random;

public class Lot<T> implements Iterable<T>
{
  private Random rnd = new Random();
  private T[] variants;

  public Lot(T... variants)
  {
    setVariants(variants);
  }

  public void setVariants(T... variants)
  {
    if(variants == null || variants.length < 2)
      throw new IllegalArgumentException("You must provide at least 2 variant");

    this.variants = variants;
  }

  public T[] getVariants()
  {
    if(variants == null)
      return null;

    T[] variantsCopy = Arrays.copyOf(variants, variants.length);
    shuffle(variantsCopy);
    return variantsCopy;
  }

  public Iterator<T> iterator()
  {
    if(variants == null)
      throw new IllegalStateException("Lot has been already thrown");

    shuffle(this.variants);
    Iterator<T> iter = new LotIterator<T>(variants);
    variants = null;
    return iter;
  }

  public void shuffle(T[] arr)
  {
    for(int i = arr.length; i > 1; i--)
      swap(arr, i - 1, rnd.nextInt(i));
  }

  private static <T> void swap(T[] arr, int i, int j)
  {
    T tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
  }

  public static void main(String[] args)
  {
    Lot<Integer> integerLot = new Lot<Integer>(1, 2, 3, 4, 5);

    System.out.println("First attempt");
    for(Integer i : integerLot)
      System.out.println(i);

    System.out.println("Second attempt");
    for(Integer i : integerLot)
      System.out.println(i);
  }

  private static class LotIterator<T> implements Iterator<T>
  {
    private T[] variants;
    private int cursor = 0;

    private LotIterator(T[] variants)
    {
      this.variants = variants;
    }

    public boolean hasNext()
    {
      return cursor < variants.length;
    }

    public T next()
    {
      T t = variants[cursor];
      cursor++;
      return t;
    }

    public void remove()
    {
      throw new UnsupportedOperationException();
    }
  }
}

Автор: kornata 9.5.2010, 10:14
LSD, Нетбинс выдаёт такой результат с ошибкой:

Код

First attempt
3
1
5
2
4
Second attempt
Exception in thread "main" java.lang.IllegalStateException: Lot has been already thrown
        at javaita.Lot.iterator(Lot.java:40)
        at javaita.Lot.main(Lot.java:64)



Почему она появилась? Как исправить, ведь так не должно быть наверное...

Автор: LSD 11.5.2010, 15:45
Цитата(kornata @  9.5.2010,  11:14 Найти цитируемый пост)
Почему она появилась?

Потому что жребий можно вытянуть только один раз:
Цитата(kornata @  25.4.2010,  22:42 Найти цитируемый пост)
итератор тоже должен возвращать элементы в случайном порядке и сразу их удалять




Цитата(kornata @  9.5.2010,  11:14 Найти цитируемый пост)
Как исправить

Код

  public static void main(String[] args)
  {
    Lot<Object> lot = new Lot<Object>(1, 2, 3, 4, 5);

    System.out.println("First attempt");
    for(Object o : lot)
      System.out.println(o);

    System.out.println("Second attempt");
    lot.setVariants('A', 'B', 'C', 'D', 'E');
    for(Object o : lot)
      System.out.println(o);
  }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)