我是函数式编程的新手,我有一个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
}
)
答案 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)