2017-01-29 8 views
0

Предположим, что у вас есть класс case SearchQualifier с двумя полями, left и right. Он может быть добавлен к экземпляру некоторого класса SearchQuery для определения поиска (например, SearchQualifier("date", "January 1, 2000")).Коллекция экземпляров класса case, сохраняющих уникальность одного поля

case class SearchQualifier(left: String, right: String) 

Теперь скажите, что у вас была коллекция SearchQualifiers. Если вы добавите новый набор в коллекцию с тем же left в качестве другого, вы намерены переопределить предыдущее значение. Например:

qualifiers = qualifiers + Qualifier("date", "January 1, 2000") 
... 
qualifiers = qualifiers + Qualifier("date", "December 31, 1999") // override 

Есть чистый способ сохранить уникальность классификаторов, основанный на left?

Мой текущий подход использует Map[String, Qualifier] где ключ карта является left, но он чувствует, как взломать:

map = map + (qual.left -> qual) 

В идеале, я бы предпочел Set -как поведение. Тем не менее, я не думаю, что было бы правильным переопределить equals, чтобы проверить только left, потому что SearchQualifier("date", "January 1, 2000") и SearchQualifier("date", "December 31, 1999"): не равно.

ответ

1

Кажется, что Map - идеальная структура данных для вас здесь, а не взлом вообще. Имеет смысл думать о Map как о том, что в основном Set, в котором каждый элемент привязан к значению. Фактически, Map имеет метод .keySet, в котором ключи возвращаются к вам как Set, который поддерживает этот аргумент. Как вы указали, переопределение .equals просто для того, чтобы это поведение в Set было бы действительно запутанным.

0

Я думаю, что самое простое решение будет использовать TreeSet

val searchQualifierOrderingByLeft = new Ordering[SearchQualifier] { 
    override def compare(x: SearchQualifier, y: SearchQualifier): Int = 
     if (x.left == y.left) 0 else 1 
    } 

    val ts = TreeSet[SearchQualifier](SearchQualifier("l1", "r1"), 
            SearchQualifier("l1", "r2"), 
            SearchQualifier("l2", "r1"))(searchQualifierOrderingByLeft) 

     println(ts) // TreeSet(SearchQualifier(l1,r2), SearchQualifier(l2,r1))