如何与Seq [Double]中的先前值进行比较

时间:2016-01-29 16:34:53

标签: scala

我是函数式编程的新手,我有一个Seq [Double],我想检查每个值是否高于(1),低(-1)或等于(0)到先前的值,像:

val g = Seq(0.1, 0.3, 0.5, 0.5, 0.5, 0.3)

我希望得到如下结果:

val result = Seq(1, 1, 0, 0, 0, -1)

有一种比以下更简洁的方式:

val g = Seq(0.1, 0.3, 0.5, 0.5, 0.5, 0.3)
g.sliding(2).toList.map(xs =>
 if (xs(0)==xs(1)){
    0
 } else if(xs(0)>xs(1)){
  -1
 } else {
    1
 }
) 

3 个答案:

答案 0 :(得分:2)

使用public void OnDown(View view) { CharSequence IdDownVote = ((TextView) ((RelativeLayout) view.getParent()).getChildAt(1)).getText(); final RequestQueue mrequestQueue = VolleySingleton.getInstance().getRequestQueue(); final String PUT_VOTE_DOWN = "someURL"; StringRequest PostVoteUp = new StringRequest(Request.Method.PUT, PUT_VOTE_DOWN, new Response.Listener<String>() { @Override public void onResponse(String response) { System.out.println(response + "reponse"); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { error.printStackTrace(); System.out.println("************Answer" + error + "error"); } }); mrequestQueue.add(PostVoteUp); System.out.println("VOTED DOWN");

compare

g.sliding(2).map{ case Seq(x, y) => y compare x }.toList 由名为OrderedProxy

的浓缩特征添加

答案 1 :(得分:1)

在我看来这是相当简洁的,但我会把它变成一个函数并将其传递给map以使其更具可读性。我使用了模式匹配和守卫。

//High, low, equal
scala> def hlo(x: Double, y: Double): Int = y - x match {
     | case 0.0 => 0
     | case x if x < 0.0 => -1
     | case x if x > 0.0 =>  1
     | }
hlo: (x: Double, y: Double)Int

scala> g.sliding(2).map(xs => hlo(xs(0), xs(1))).toList
res9: List[Int] = List(1, 1, 0, 0, -1)

答案 2 :(得分:1)

我同意上面的Travis Brown's comment,所以我建议将其作为答案。

反转zip中值的顺序,只是为了匹配g的顺序。这具有使用元组而不是序列的额外好处,因此不需要模式匹配。

(g, g.tail).zipped.toList.map(t => t._2 compare t._1)


res0: List[Int] = List(1, 1, 0, 0, -1)