Почему не java.утиль.У HashSet есть метод get(Object o)?
Я видел другие вопросы о получении объектов от Setна основе значения Индекса, и я понимаю, почему это невозможно. Но я не смог найти хорошего объяснения, почему получить объект не допускается, поэтому подумал, что я спрошу.
HashSet стоит HashMap поэтому получение объекта из него должно быть довольно простым. Как и сейчас, похоже, мне придется перебирать каждый элемент в HashSet и проверки на равенство, которое кажется ненужный.
я мог бы просто использовать Map но мне не нужен ключ:значение пары, мне просто нужен Set.
например сказать, что у меня есть Foo.java:
package example;
import java.io.Serializable;
public class Foo implements Serializable {
String _id;
String _description;
public Foo(String id){
this._id = id
}
public void setDescription(String description){
this._description = description;
}
public String getDescription(){
return this._description;
}
public boolean equals(Object obj) {
//equals code, checks if id's are equal
}
public int hashCode() {
//hash code calculation
}
}
и Example.java:
package example;
import java.util.HashSet;
public class Example {
public static void main(String[] args){
HashSet<Foo> set = new HashSet<Foo>();
Foo foo1 = new Foo("1");
foo1.setDescription("Number 1");
set.add(foo1);
set.add(new Foo("2"));
//I want to get the object stored in the Set, so I construct a object that is 'equal' to the one I want.
Foo theFoo = set.get(new Foo("1")); //Is there a reason this is not allowed?
System.out.println(theFoo.getDescription); //Should print Number 1
}
}
это потому, что метод equals предназначен для проверки "абсолютного" равенства, а не" логического " равенства (в этом случае contains(Object o) будет достаточно)?
10 ответов:
A
SetэтоCollectionобъектов, которые лечитa.equals(b) == trueкак дубликаты, поэтому нет смысла пытаться получить тот же объект, который у вас уже есть.если вы пытаетесь
get(Object)из коллекции, aMapвероятно, будет более подходящим.что вы должны написать это
Map<String, String> map = new LinkedHashMap<>(); map.put("1", "Number 1"); map.put("2", null); String description = set.get("1");если объект не находится в наборе (на основе equals), добавьте его, если он находится в наборе (на основе equals), дайте мне экземпляр этого набора объект
в маловероятном случае вам это нужно вы можете использовать
Map.Map<Bar, Bar> map = // LinkedHashMap or ConcurrentHashMap Bar bar1 = new Bar(1); map.put(bar1, bar1); Bar bar1a = map.get(new Bar(1));
Java Карта / Коллекция Шпаргалка
будет ли он содержать только пару ключ / значение или значения?
1), если он содержит пар выбор карту. Важен ли порядок?
. 1-1) если да, следовать порядком вставки или Сортировать по клавишам?
. . 1-1-1), если прикажут, LinkedHashMap
. . 1-1-2) если отсортированный, TreeMap
. 1-2) если заказ не важно HashMap
2) если он сохраняет только значения выбор коллекции. Будет ли он содержать дубликаты?
. 2-1) если да,ArrayList
. 2-2) если он будет не содержать дубликаты, является основной задачей поиска элементов (содержит/удалить)?
. . 2-2-1) если нет,ArrayList
. . 2-2-2) если да, порядок важен?
. . . 2-2-2-1) если заказ не важно HashSet
. . . 2-2-2-2) если да, по порядку ввода и сортировки по значениям?
. . . . 2-2-2-2-1) если приказал, LinkedHashSet
. . . . 2-2-2-2-2) если отсортированный,TreeSet
ваше последнее предложение-это ответ.
get(Object o)будет работать черезHashSetищем другой объект, равныйo(черезequals(o)метод). Так что это действительно то же самое, чтоcontains(o), только не возвращает тот же результат.
HashSet немного проще, чем HashMap. Если вам не нужны функции HashMap, зачем его использовать? Если метод, подобный getObject (ObjectType o), был реализован Java, нам не нужно повторять набор после вызова contain () methode...
причина, по которой нет get проста:
Если вам нужно получить объект X из набора, потому что вам нужно что-то из X, и у вас нет объекта.
Если у вас нет объекта, то вам нужно некоторые средства (ключ), чтобы найти его. ..его Имя, номер чего бы то ни было. Вот для чего нужны карты.
карта.get ("ключ") - > X!
наборы не имеют ключей, вам нужно йо пересечь их, чтобы получить объекты.
Так, почему бы не добавить удобный get (X) - > X
Это не имеет смысла правильно, потому что у вас уже есть X, пурист скажет.
но теперь посмотрите на него как на не пуриста, и посмотрите, действительно ли вы этого хотите:
скажем, я делаю объект Y, который соответствует равным X, так что набор.get (Y)->X. воля, тогда я могу получить доступ к данным X, которые у меня не было. Скажем, например, у X есть метод get flag (), и я хочу получить результат этого.
теперь посмотрите на этот код.
Y
X = карта.get (Y);
Итак, y равно (x ) true!
но..
Y. flag () = = X. flag () = false. ( Разве они не были равны ?)
Итак, вы видите, если set позволил вам получить такие объекты, это, безусловно, должно нарушить основную семантику равных. Позже вы будете жить с маленькими клонами X, которые все кричат, что они одинаковы, когда их нет.
вам нужна карта, чтобы хранить вещи и использовать ключ, чтобы восстановить его.
Если вы только хотите знать, что находится в Hashset, вы можете использовать
.toString();способ, чтобы отобразить все содержимое для поиска HashSet, разделенных запятой.
мы хотим иметь доступ к элементу непосредственно через его ключевое значение вместо того, чтобы сначала определить его местоположение путем поиска значение ключа в массиве. (вот почему интерфейс Set имеет метод
contains(obj)вместоget(index).)структуры данных: абстракция и дизайн с использованием Java, Koffman
Как все уже упоминали ранее, такого метода нет и по уважительным причинам. При этом, если вы хотите получить определенный объект из хэш-набора в java 8 с помощью однострочного (почти), просто используйте потоки. В вашем случае, это будет что-то вроде:
Foo existing = set.stream().filter(o -> o.equals(new Foo("1"))).collect(Collectors.toList()).iterator().next();обратите внимание, что исключение будет выдано, если элемент не существует, поэтому он технически не является однострочным, хотя если фильтр правильно реализован, он должен быть быстрее, чем традиционная итерация над элементы коллекции.
Comments