Альтернатива 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( );
}
TreeSet не использует hashCode
вообще. Он использует либо compareTo
, либо Comparator, который вы передали конструктору. Это используется такими методами, как contains для поиска объектов в наборе.
Итак, ответ на ваш вопрос состоит в том, что ваш метод compareTo или ваш Comparator определены так, что два рассматриваемых объекта считаются равными.
Из javadocs :
экземпляр TreeSet выполняет все сравнения элементов с использованием его compareTo (или compare), поэтому два элементы, которые считаются равными этим метода являются, с точки зрения set, equal.
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.
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.
Вам не нужно проверять, содержится ли она, потому что insert () в основном выполняет ту же операцию (т. е. поиск правильное положение) на пути к точке вставки. Если объект не может быть вставлен (т.е. объект уже содержится), insert возвращает false.