2016-11-14 15 views
0

私の現在のシステムは、マップされた文字列、リスト[Int]、文字列がキー値 "Sk1"、 "Sk2"などであり、intは0-9。マップリスト内の*より大きい値を見つける

すべてのリストを検索する現在の方法ですが、これを編集して選択した「SK *」よりも大きい「Sk *」だけを見つける方法を教えてください。リストの値は末尾の最後の要素ですが、これはすでに検索する関数を持っています。これはhandleFiveオプションメニューです。明確にするために、私は最後の要素(すでにその機能を持っている)を見つけて、選択した株よりも大きな株のみを表示する必要があります。起動すると、これを編集する方法

// Returns a single result, not a list 
    def mnuShowSingleDataStock(f: (String) => (String,Int)) = { 
    print("Stock > ") 
    val data = f(readLine) 
    println(s"${data._1}: ${data._2}") 
    } 

//Returns a list value 
    def mnuShowPointsForStock(f: (String) => (String,List[Int])) = { 
    print("Stock > ") 
    val data = f(readLine) 
    println(s"${data._1}: ${data._2}") 
    } 

わからないユーザーとの対話メニューオプション

def handleFive(): Boolean = { 
    mnuShowSingleDataStock(currentStockLevel) 
    true 
    } 

    def handleSeven(): Boolean = { 
    mnuShowPointsForStock(allStockLevel) 
    true 
    } 

関数の

ハンドラは、現在、それは、リストのすべての値を示し、I選択した値より大きい値のみを返すだけです。

//Show last element in the list, most current 
    def currentStockLevel (stock: String): (String, Int) = { 
    (stock, mapdata.get (stock).map(findLast(_)).getOrElse(0)) 
    } 

//Unsure how to change this to only return values greater than the selected one, not everything 
    def currentStockLevel (stock: String): (String, List[Int]) = { 
    (stock, mapdata.get (stock).map(findLast(_)).getOrElse(0)) 
    } 

私の現在リストにマッピング - これはMap[String, List[Int]]タイプが所与の述語を満たすだけのキーを維持するために、filterKeys(f: String => Boolean)方法を有している地図データ

val mapdata = Map(
    "SK1" -> List(9, 7, 2, 0, 7, 3, 7, 9, 1, 2, 8, 1, 9, 6, 5, 3, 2, 2, 7, 2, 8, 5, 4, 5, 1, 6, 5, 2, 4, 1), 
    "SK2" -> List(0, 7, 6, 3, 3, 3, 1, 6, 9, 2, 9, 7, 8, 7, 3, 6, 3, 5, 5, 2, 9, 7, 3, 4, 6, 3, 4, 3, 4, 1), 
    "SK3" -> List(8, 7, 1, 8, 0, 5, 8, 3, 5, 9, 7, 5, 4, 7, 9, 8, 1, 4, 6, 5, 6, 6, 3, 6, 8, 8, 7, 4, 0, 6), 
    "SK4" -> List(2, 9, 5, 7, 0, 8, 6, 6, 7, 9, 0, 1, 3, 1, 6, 0, 0, 1, 3, 8, 5, 4, 0, 9, 7, 1, 4, 5, 2, 8), 
    "SK5" -> List(2, 6, 8, 0, 3, 5, 5, 2, 5, 9, 4, 5, 3, 5, 7, 8, 8, 2, 5, 9, 3, 8, 6, 7, 8, 7, 4, 1, 2, 3), 
    "SK6" -> List(2, 7, 5, 9, 1, 9, 8, 4, 1, 7, 3, 7, 0, 8, 4, 5, 9, 2, 4, 4, 8, 7, 9, 2, 2, 7, 9, 1, 6, 9), 
    "SK7" -> List(6, 9, 5, 0, 0, 0, 0, 5, 8, 3, 8, 7, 1, 9, 6, 1, 5, 3, 4, 7, 9, 5, 5, 9, 1, 4, 4, 0, 2, 0), 
    "SK8" -> List(2, 8, 8, 3, 1, 1, 0, 8, 5, 9, 0, 3, 1, 6, 8, 7, 9, 6, 7, 7, 0, 9, 5, 2, 5, 0, 2, 1, 8, 6), 
    "SK9" -> List(7, 1, 8, 8, 4, 4, 2, 2, 7, 4, 0, 6, 9, 5, 5, 4, 9, 1, 8, 6, 3, 4, 8, 2, 7, 9, 7, 2, 6, 6) 
) 
+0

@CyrilleCorpet @ CyrilleCorpet @ CyrilleCorpet質問を更新してもう少し理解できるようにしましたか? –

+0

在庫がSK3の場合は、SK4、SK5 ...〜SK9、または最後の要素よりも大きな値を持つSK3のすべての要素の最後の要素を取得しますか? –

+0

私はSK3を選択した場合、SK3の最後の値より高い最後の値を持つSK4、SK5などのすべての最後の要素を必要とします@CyrilleCorpet –

答えて

2

です。あなただけの「SK」キーを持って確実である場合

可能な解決策は、

// get int value from stock if of the form "SK<int>" 
def stockInt(stock: String): Option[Int] = 
    Try(stock.drop(2).toInt).filter(_ => stock.startsWith("SK")).toOption 

// we keep the keys in the return, so that you do not get unordered results 
// (order is not assured by Map) 
def currentStockLevel(stock: String): (String, Map[String, Int]) = { 
    val maybeN = stockInt(stock) 
    def isGreater(other: String) = (for { 
    o <- stockInt(other) 
    n <- maybeN 
    } yield o > n).getOrElse(true) // if any key is not in the form of SK*, assume it is greater than the original stock 

    (
    stock, 
    mapdata.filterKeys(isGreater(_)).mapValues(findLast(_)) 
) 
} 

別の可能性になり、あなたがすることを確認しているように、そのキーのSortedSetを使用していますSortedMapを、使用することですあなたが望むように順序付けられたキーと値のペアがあります。

その場合、解決策は

//put all values in mapdata in a SortedMap 
val sortedMap = SortedMap[String, List[Int]]() ++ mapdata 

def currentStockLevel(stock: String): (String, List[Int]) = { 
    (
    stock, 
    sortedMap.dropWhile(_ <= stock).toList.map(_._2).map(findLast(_)) 
) 
} 

EDIT(リターンとして期待されているかについてのコメントの後に)次のようになります。私はあなたがやろうとしているものも理解していればあなたは、

キーではなく値をフィルタリングしたいこれはMapもちょうどそれをするfilter(p: ((K, V)) => Boolean): Map[K, V]方法があり、問題ではありません。

def currentHigherStockLevel(stock: String): Map[String, Int] = { 
    val current = datamap.get(stock).map(findLast).getOrElse(0) // if stock is not in the keySet, we keep all keys, by keeping those greater than 0. 
    datamap.mapValues(findLast).filter { 
    case (sk, val) => val > current 
    } 
} 

これは、値が(私たちはので、自分のキーをパラメータとして与えられたものよりも大きくなっている最後のものに保ついるMap[String; Int]を返します。彼らはおそらく有用だろう)。

+0

私の現在のシステムは、 "SK1"を検索することができ、リストの最後の項目。この例では「1」なので、「SK1> 1」が返されます。私は "SK1"を検索することができ、最後の値を返す代わりに、検索されたものより大きい他のすべてのリストから他のすべての最後の値を返します。 –

1

キーの文字列が"SK9""SK10"のようなもの、あなたがそれらをフィルタリング/、数字を切り出すIntに変換し、比較する必要がありますが、あなたの鍵が完全に一貫性のある形式で保存されている場合であれば:"SK001""SK002" .. "SK009""SK010" ... "SK099""SK100"など、単純な文字列比較を使用して、必要なものだけをフィルタリングします。

mapdata.filterKeys(_ >= stock).values // an Iterable[List[Int]] 
+0

エラー "Can not resolve" filterKeys ""私はこの方法を使用しようとすると、何か考えですか? –

+0

filterKeysは、 'option [List [Int]]'である 'mapdata.get(stock)'ではなく、 'mapdata'のメソッドです。 –

+0

申し訳ありませんが、提案されたフィルタを間違った場所に挿入しました。複数の結果をどのように処理/返すかはわかりませんが、これをフィルタリングする方法です。 – jwvh

関連する問題