2013-06-11 1 views
1

У меня есть Java Set<MyClass>, на котором я переопределил equals и hashCode, чтобы использовать переменную String name;.Использование набора с одним классом, но найти с помощью String

public class MyClass{ 
    final String name; 
    public boolean equals(Object o){...} 
    public int hashCode(){return name.hashCode();} 
} 

Есть в любом случае я могу получить объект из HashSet, используя что-то вроде

MyClass o = set.get("nameofmyobject"); 

Есть ли способ сделать это в Java, или структура данных? или мне нужно изменить все мои наборы на Карты?

ответ

2

Посмотрите на this q uestion. Ответ - нет. Set s не для получения элементов, а для поиска равенства. Используйте установку Map или List.

+0

В списке дается 'O (n)' доступ. Мог бы просто перебирать множество. – tom

+0

Мне нравится ссылка на этот вопрос. Я этого не видел. Даже этот вопрос на самом деле не объясняет, почему :( –

+0

Если вы посмотрите в наборе для объекта, у вас есть объект уже, иначе вы не смогли бы его найти. Думаю, почему бы не работать с объектом после проверки равенства ? –

3

№ Вам необходимо изменить на Map. Ни один из методов Set не возвращает элемент.

Приложение А
Если вы не заботитесь о скорости всегда можно найти вручную:

MyClass find(String name, Set<MyClass> set) 
{ 
    MyClass wrapper = new MyClass(name); 
    for (MyClass e : set) { 
     if (wrapper.equals(e)) { 
      return e; 
     } 
    } 
    return null; 
} 

Добавление B
Если вы используете TreeSet вы можете использовать floor:

MyClass find(String name, TreeSet<MyClass> set) 
{ 
    MyClass wrapper = new MyClass(name); 
    MyClass candidate = set.floor(wrapper); 
    if (candidate != null && wrapper.equals(candidate)) { 
     return candidate; 
    } else { 
     return null; 
    } 
} 
+0

Я действительно забочусь о скорости, поэтому я использую набор, и теперь придется перейти к карте. Мне просто не нравится увеличивать требования к пространству с помощью 'O (n)' для хранения (что мне кажется) избыточных ключей –

+0

@JaySmith Больше не будет использовать пробел. Java 'HashSet' реализуется с помощью' HashMap'. См. [Источник JDK7] (http://hg.openjdk.java.net/jdk7/2d/jdk/file/8f19b165347b/src/share/classes/java/util/HashSet.java). – tom

+0

Спасибо за ссылку tom, никогда не знал, что –

1

Как сказал Тим, вы не можете. И если это так, вы должны называть его как set.get (myClassInstance); и не set.get (некоторые члены хранимого экземпляра)

Использование

Map<String, MyClass> myMap = new HashMap<String, MyClass>(); 
Смежные вопросы