Java - TreeSet и хэш-код ()

Альтернатива Pairs реализация, с помощью последней пары, которая сохранит предыдущее значение:

static IEnumerable<Pair<T, T>> Pairs( IEnumerable<T> collection ) {
  Pair<T, T> pair = null;
  foreach( T item in collection ) {
    if( pair == null )
      pair = Pair.Create( default( T ), item );
    else
      yield return pair = Pair.Create( pair.Second, item );
  }
}

Простой Window реализация (только безопасный для личного пользования, если вызывающая сторона не сохраняет возвращенные массивы; см. примечание):

static IEnumerable<T[]> Window( IEnumerable<T> collection, int windowSize ) {
  if( windowSize < 1 )
    yield break;

  int index = 0;
  T[] window = new T[windowSize];
  foreach( var item in collection ) {
    bool initializing = index < windowSize;

    // Shift initialized window to accomodate new item.
    if( !initializing )
      Array.Copy( window, 1, window, 0, windowSize - 1 );

    // Add current item to window.
    int itemIndex = initializing ? index : windowSize - 1;
    window[itemIndex] = item;

    index++;
    bool initialized = index >= windowSize;
    if( initialized )
      //NOTE: For public API, should return array copy to prevent 
      // modifcation by user, or use a different type for the window.
      yield return window;
  }
}

использование В качестве примера:

for( int i = 0; i <= items.Length; ++i ) {
  Console.WriteLine( "Window size {0}:", i );
  foreach( string[] window in IterTools<string>.Window( items, i ) )
    Console.WriteLine( string.Join( ", ", window ) );
  Console.WriteLine( );
}
18
задан Basil Bourque 6 July 2015 в 03:11
поделиться

4 ответа

TreeSet не использует hashCode вообще. Он использует либо compareTo , либо Comparator, который вы передали конструктору. Это используется такими методами, как contains для поиска объектов в наборе.

Итак, ответ на ваш вопрос состоит в том, что ваш метод compareTo или ваш Comparator определены так, что два рассматриваемых объекта считаются равными.

Из javadocs :

экземпляр TreeSet выполняет все сравнения элементов с использованием его compareTo (или compare), поэтому два элементы, которые считаются равными этим метода являются, с точки зрения set, equal.

41
ответ дан 30 November 2019 в 06:46
поделиться

You need to read Joshua Bloch's "Effective Java" chapter 3. It explains the equals contract and how to properly override equals, hashCode, and compareTo.

0
ответ дан 30 November 2019 в 06:46
поделиться

From Java Doc:

If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result.

Means: the objects you use for hashing are not equal.

4
ответ дан 30 November 2019 в 06:46
поделиться

Вам не нужно проверять, содержится ли она, потому что insert () в основном выполняет ту же операцию (т. е. поиск правильное положение) на пути к точке вставки. Если объект не может быть вставлен (т.е. объект уже содержится), insert возвращает false.

0
ответ дан 30 November 2019 в 06:46
поделиться
Другие вопросы по тегам:

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