Реализация элегантной карты - PullRequest
0 голосов
/ 05 июня 2011

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

var list1:Map[Char, List[String]] = Map('a' -> List("alone", "away"))
var list2:List[String] = List("I", "am", "alone", "at", "home", "watching", "batman", "XD")

Теперь, реализовав мой код таким образом, работать с ними «сложно», пытаясь считать первый список простым списком, поэтому мне было интересноесли бы был еще один более элегантный способ решить эту проблему.Если мне нужно проверить, есть ли у list1 «один», я сначала должен получить ключ «a», а затем вызвать содержащий метод.Мне пришлось реализовать такую ​​вещь.

if ( list1( "alone".charAt(0) ).contains( "alone" ) ) ...

Ужасно каждый раз извлекать ключ, а затем сравнивать списки, и я хотел бы создать новую карту (или список), которая реализуетэто под капотом (он автоматически извлекает ключ и затем работает над списком).Что ты предлагаешь?Спасибо.

РЕДАКТИРОВАТЬ: Я переписал часть вопроса с уточнением некоторых моментов.Первый список упорядочен, второй номер.

Ответы [ 2 ]

4 голосов
/ 05 июня 2011

Из всего, что я видел, ты действительно хочешь просто список.Так что используйте список.(Или, возможно, SortedSet http://www.scala -lang.org / api / current / scala / collection / SortedSet.html )

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

Тогда люди смогут помочь.

0 голосов
/ 05 июня 2011

Я не уверен, почему использование карт поможет вам сравнить списки строк, но в любом случае:

Если вы не возражаете против использования изменяемой коллекции, и вы уверены, что в вашем списке нет повторений(так что вы можете использовать набор), тогда вы можете использовать черту MultiMap:

import scala.collection.mutable._
val mm = new HashMap[Char,Set[String]] with MultiMap[Char,String]
Seq("alone","away").foreach(s => mm.addBinding(s(0),s))

scala> mm
res2: scala.collection.mutable.HashMap[Char,scala.collection.mutable.Set[String]]
 with scala.collection.mutable.MultiMap[Char,String] = 
 Map(a -> Set(alone, away))

scala> mm.entryExists('a',"alone")

К сожалению, многопоточность исчезает, когда вы используете операцию с коллекциями (это просто простая карта из Char до Set[String] тогда).

...