Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Java] Структура данных 
:(
    Опции темы
kornata
Дата 25.4.2010, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 25.2.2010

Репутация: нет
Всего: нет



Помогите выполнить задание:

Создайте generic структуру данных, позволяющую тянуть жребий и исключающую возможность подглядывания. Она должна предоставлять возможность добавить несколько элементов и затем в случайном порядке их извлечь. Для хранения элементов используйте массив, реализуйте по крайней мере интерфейс Iterable, при этом итератор тоже должен возвращать элементы в случайном порядке и сразу их удалять. 
PM MAIL   Вверх
kornata
Дата 6.5.2010, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 25.2.2010

Репутация: нет
Всего: нет



Помогите, кто-нибудь... smile 
PM MAIL   Вверх
LSD
Дата 7.5.2010, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 9
Всего: 538



Код

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();
    }
  }
}



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
kornata
Дата 9.5.2010, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 25.2.2010

Репутация: нет
Всего: нет



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)



Почему она появилась? Как исправить, ведь так не должно быть наверное...
PM MAIL   Вверх
LSD
Дата 11.5.2010, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 9
Всего: 538



Цитата(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);
  }



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0735 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.