Почему делает java.util. Интерфейс <V> набора не обеспечивает, получение (Возразите o), метод? [закрытый]

Я наконец-то нашел ответ на свой вопрос, если кто-то пытается выяснить, как это работает, проверьте ниже фрагмент

import React from 'react';
import Zoom from 'react-reveal/Zoom';

class ZoomExample extends React.Component {
  render() {
    return (
      <h1>
        <Zoom left cascade>
        <div style={{display:'inline-block'}}>React</div>

        </Zoom><Zoom right cascade> 
        <div style={{display:'inline-block'}}> Reveal</div>
        </Zoom>
      </h1>
    );
  }
}
.
42
задан skaffman 30 August 2011 в 15:36
поделиться

11 ответов

Хотя аргумент чистоты действительно вызывает подозрение у метода get (Object) , основной целью является не спорно.

Существуют различные семейства классов и интерфейсов, которые немного переопределяют equals (Object) . Не нужно смотреть дальше интерфейсов коллекций. Например, ArrayList и LinkedList могут быть равны; их соответствующее содержимое просто должно быть одинаковым и в том же порядке.

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

public interface Collection<E> extends ... {
  ...
  public E findMatch(Object o) throws UnsupportedOperationException;
  ...
}

. Обратите внимание, что этот API имеет более широкое значение, чем в Set.

Что касается самого вопроса, у меня нет теории относительно того, почему такая операция была опущено. Я скажу, что аргумент минимального остовного набора не выполняется, потому что многие операции, определенные в API коллекций, мотивированы удобством и эффективностью.

30
ответ дан 26 November 2019 в 23:57
поделиться

Проблема: Set не предназначен для "получения" объектов, он предназначен для добавления и проверки наличия. Я понимаю, что вы ищете, у меня была похожая ситуация, и я закончил использовать карту того же объекта по ключу и значению.

РЕДАКТИРОВАТЬ: Просто для пояснения: http://en.wikipedia.org/wiki / Set_ (abstract_data_type)

12
ответ дан 26 November 2019 в 23:57
поделиться

I think you've answered your own question: it is redundant.

Set provides Set#contains (Object o) which provides the equivalent identity test of your desired Set#get(Object o) and returns a boolean, as would be expected.

-6
ответ дан 26 November 2019 в 23:57
поделиться

Просто используйте решение Map ... TreeSet и HashSet также делают это, поскольку они поддерживаются TreeMap и HashMap, поэтому за это нет никаких штрафов (на самом деле это должно быть минимальным выигрышем).

Вы также можете расширить свой любимый Set, добавив метод get ().

[]]

1
ответ дан 26 November 2019 в 23:57
поделиться

«Мне нужен точный экземпляр объекта, который уже есть в наборе, а не, возможно, другой экземпляр объекта, где .equals () возвращает истину».

Это не имеет смысла. Допустим, вы делаете:

Set<Foo> s = new Set<Foo>();
s.Add(new Foo(...));
...
Foo newFoo = ...;

Теперь вы делаете:

s.contains(newFoo)

Если вы хотите, чтобы это было истинно, только если объект в наборе == newFoo, реализуйте Foo equals и hashCode с идентификатором объекта. Или, если вы пытаетесь сопоставить несколько одинаковых объектов с каноническим оригиналом, тогда карта может быть правильным выбором.

0
ответ дан 26 November 2019 в 23:57
поделиться

Я думаю, что ожидание таково, что равенство действительно представляет некоторое равенство, а не просто то, что два объекта, например, имеют одинаковый первичный ключ. И если equals представляет два действительно равных объекта, то get будет избыточным. Вариант использования, который вы хотите, предлагает карту и, возможно, другое значение для ключа, что-то, что представляет первичный ключ, а не весь объект, а затем надлежащим образом реализовать равенства и хэш-код соответственно.

0
ответ дан 26 November 2019 в 23:57
поделиться

Что ж, если у вас уже есть вещь из набора, вам не нужно ее получать (), вы? ; -)

Думаю, ваш подход к использованию карты - правильный. Похоже, вы пытаетесь «канонизировать» объекты с помощью их метода equals (), который я всегда добивался, используя карту, как вы предлагаете.

1
ответ дан 26 November 2019 в 23:57
поделиться

Я не уверен, ищете ли вы объяснение того, почему Sets так себя ведут , или для простого решения поставленной проблемы. Другие ответы касались первого, поэтому вот предложение для последнего.

Вы можете перебирать элементы Set и проверять каждый из них на равенство, используя метод equals (). Его легко реализовать, и он практически не подвержен ошибкам. Очевидно, что если вы не уверены, входит ли элемент в набор или нет, заранее проверьте метод contains ().

Это неэффективно по сравнению, например, с методом contains () HashSet, который «находит "сохраненный элемент, но не вернет его. Если ваши наборы могут содержать много элементов, это может быть даже поводом использовать «более тяжелые» обходной путь, такой как реализация карты, которую вы упомянули. Однако, если это так важно для вас (а я действительно вижу пользу от этой способности), вероятно, оно того стоит.

1
ответ дан 26 November 2019 в 23:57
поделиться

Функциональная Java имеет реализацию постоянного набора (поддерживаемого красным / черным деревом), который, кстати, включает метод split , который, кажется, делает то, что вы хотите. Он возвращает тройку из:

  1. Набор всех элементов, которые появляются перед найденным объектом.
  2. Объект типа Option , который либо пуст, либо содержит найденный объект, если он существует в наборе .
  3. Набор всех элементов, которые появляются после найденного объекта.

Вы должны сделать что-то вроде этого:

MyElementType found = hayStack.split(needle)._2().orSome(hay);
0
ответ дан 26 November 2019 в 23:57
поделиться

Я думаю, что ваше единственное решение, учитывая некоторую реализацию Set, - это перебрать его элементы, чтобы найти тот, который равен equals () - тогда у вас есть фактический объект в Set, который соответствует.

K target = ...;
Set<K> set = ...;
for (K element : set) {
  if (target.equals(element)) {
    return element;
  }
}
1
ответ дан 26 November 2019 в 23:57
поделиться

Я понимаю, что у вас может быть два одинаковых объекта, но это не один и тот же экземпляр.

Например,

Integer a = new Integer(3);
Integer b = new Integer(3);

В этом случае a.equals (b), потому что они относятся к одному и тому же внутреннему значению, но a! = B, потому что это два разных объекта.

Существуют и другие реализации Set, такие как IdentitySet , которые выполняют различное сравнение между элементами.

Однако я думаю, что вы пытаетесь применить к Java другую философию. Если ваши объекты равны (a.equals (b)), хотя a и b имеют разное состояние или значение, здесь что-то не так. Вы можете разделить этот класс на два или более семантических класса, которые реализуют общий интерфейс - или, возможно, пересмотреть .equals и .hashCode.

Если у вас есть Эффективная Java Джошуа Блоха, взгляните на главы под названием "

1
ответ дан 26 November 2019 в 23:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: