2015-06-15 8 views
-1

У меня есть программа, для которой я должен использовать HashSet. Мой вопрос возникает из-за того, что HashSets в основном содержат один объект, но если я хочу отправить информацию другому классу, он принимает три объекта: одну строку, один int и один логический. Назначения говорит, что я должен использовать HashSetJava: HashSet несколько типов

Конструктор Я пытаюсь отправить информацию:

public Magic (String name, int size, boolean isVisible) 

У меня есть класс, который должен посылать наборы заклинаний, содержащими name, size и isVisible ,

Magic.go() Класс:

public void go() 
{ 
    int i = 0; 
    while (i < size) { 
     if (isVisible == true) { 
      System.out.println(name + "!"); 
     } 
     i++; 
    } 
} 
+0

У вас есть только один тип объекта, а именно 'Magic'. Поэтому сделайте это 'Set '. – SqueezyMo

+0

Просто создайте объект 'Spell', который содержит ваши три переменные в виде полей:' name', 'size' и' isVisible'. – River

+0

@SqueezyMo Когда я пытаюсь добавить новый элемент в HashSet ('spells.add (« Test », 12, true);'), я получаю ошибку, которая '' не подходит метод найден для add (java.lang.String , INT, логический) '. – WhyIsItReal

ответ

4

Просто создать объект, который содержит все три поля, как это:

import java.util.Objects; 

public class NameSizeVisible { 
    private final String name; 
    private final int size; 
    private final boolean isVisible; 

    public NameSizeVisible(String name, int size, boolean isVisible) { 
     this.name = name; 
     this.size = size; 
     this.isVisible = isVisible; 
    } 


    public String getName() { 
     return name; 
    } 

    public int getSize() { 
     return size; 
    } 

    public boolean isVisible() { 
     return isVisible; 
    } 

    @Override 
    public int hashCode() { 
     return Objects.hash(name,size,isVisible); 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     NameSizeVisible other = (NameSizeVisible) obj; 
     if (isVisible != other.isVisible) 
      return false; 
     if (!Objects.equals(name, other.name)) 
      return false; 
     if (size != other.size) 
      return false; 
     return true; 
    } 
} 
+0

В чем смысл двух методов' @ Override'? – WhyIsItReal

+1

Override - это способ, по которому вы указываете, что реализуемый вами метод существует в классе, на котором вы наследуете. в этом случае из объекта. – Joeblade

+0

@WhyIsItReal, чтобы вы могли сравнить эти объекты Magic для равенства, если это необходимо. –

-3

Вы можете использовать HashSet, который хранит объекты. Таким образом, вы бы:

HashSet<Object> set = new HashSet<>(); 
set.add(name); 
set.add(size); 
set.add(isVisible); 

Затем, когда вы получаете доступ к объектам нужно просто бросить их в соответствующие типы:

String name = ""; 
int size = 0; 
boolean isVisible = false; 

for (Object o : set) { 
    if (o instanceof String) { 
     name = (String) o; 
    } else if (o instanceof int) { 
     size = (int) o; 
    } else { 
     isVisible = (boolean) o; 
    } 
} 
+1

Как правило, если вы используете instanceof, вам нужно либо спрятать его за методом (из-за какого-то ограничения в дизайне), либо вам нужно изменить свой дизайн на использование OO – Joeblade

+0

Да, но она сказала, что ей нужно добавить эти 3 к набору, который затем передается магическому объекту. Исходя из ограничений, заключающихся в том, что они могут использовать HashSet для этого, существует не так много отличных способов – user3354059

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