在 PlayFramework2 的 Scala 模板中使用索引和原始顺序迭代地图。当前迭代后如何拾取?
Iterate over map with index and original order in Scala template in PlayFramework2. How to pick up the one after currently iterated?
我正在尝试在 playFramework2.2 的 scala 模板中遍历地图。
这是相关代码:
<ol>
@for(((key, value), currentIndex) <- m.myMap.zipWithIndex) {
<li>@key - @value - @currentIndex</li>
}
</ol>
java 中的地图声明:
Map myMap = new HashMap<String, Integer>();
scala 中的地图声明:
meters: List[intranet.controllers.Index.Meter]
而且我已经使用 java 方法对该地图(按值)进行了排序,如下所示:
public static Map sort(Map unsortMap, Order order) {
List list = new LinkedList(unsortMap.entrySet());
comparator = new Comparator() {
public int compare(Object o1, Object o2) {
return ((Comparable) ((Map.Entry) (o1)).getValue()).compareTo(((Map.Entry) (o2)).getValue());
}
}
Collections.sort(list, comparator);
Map sortedMap = new LinkedHashMap();
for (Iterator it = list.iterator(); it.hasNext();) {
Map.Entry entry = (Map.Entry) it.next();
sortedMap.put(entry.getKey(), entry.getValue());
}
return sortedMap;
}
不幸的是,我的问题是我使用 zipWithIndex
方法遍历地图时丢失了订单。
这是当前结果:
Key - Value - Index
WA - 41 - 4
BA - 66 - 0
BM - 52 - 2
DP - 0 - 6
JTM - 0 - 7
TN - 59 - 1
WP - 46 - 3
SM - 0 - 5
如您所见,它没有排序,但应该是这样的:
Key - Value - Index
BA - 66 - 0
TN - 59 - 1
BM - 52 - 2
WP - 46 - 3
WA - 41 - 4
SM - 0 - 5
DP - 0 - 6
JTM - 0 - 7
所以问题是:
- 如何以原始顺序遍历带有索引的地图?
我想出了第一个问题。这是工作循环代码:
@for(((key, value), currentIndex) <- m.lastMonthRanking.view.zipWithIndex) {
<li>
<span @if(session().get("email").equals(key)){ class="label label-info" style="font-size: 100%; display: grid"}>@key
<span class="badge">@value</span>
</span>
</li>
}
- 如何访问当前迭代的 next/previous 元素 after/before?
编辑
我有一张地图,其中键是 @userName
(字符串),@value
是(整数)。
我想打印 @value
订购的列表 <ol><li>@userName (@value)</li></ol>
。如果值在许多用户中重复,我想以其他方式打印这些元素,所以我必须知道列表中的 next/previous 元素是否具有相同的值。通常在 java 列表中我会做这样的事情:
for (int i = 0; i < CrunchifyList.size(); i++) {
System.out.println(CrunchifyList.get(i-1) + " is previous element");
System.out.println(CrunchifyList.get(i) + " is current element");
System.out.println(CrunchifyList.get(i+1) + " is next element");
}
但现在我需要在 scala 和地图中执行此操作。
请帮忙
关于第一个问题,你应该使用维护插入顺序的地图。一个例子是 scala.collection.immutable.ListMap
.
@ import scala.collection.immutable.{HashMap, ListMap}
import scala.collection.immutable.{HashMap, ListMap}
@ val l = 1 to 5
l: collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5)
@ val hm = HashMap(l.zipWithIndex: _*)
hm: HashMap[Int, Int] = Map(5 -> 4, 1 -> 0, 2 -> 1, 3 -> 2, 4 -> 3)
@ val lm = ListMap(l.zipWithIndex: _*)
lm: ListMap[Int, Int] = Map(1 -> 0, 2 -> 1, 3 -> 2, 4 -> 3, 5 -> 4)
@for(((key, value), currentIndex) <- m.myMap.iterator.zipWithIndex) {
我正在尝试在 playFramework2.2 的 scala 模板中遍历地图。 这是相关代码:
<ol>
@for(((key, value), currentIndex) <- m.myMap.zipWithIndex) {
<li>@key - @value - @currentIndex</li>
}
</ol>
java 中的地图声明:
Map myMap = new HashMap<String, Integer>();
scala 中的地图声明:
meters: List[intranet.controllers.Index.Meter]
而且我已经使用 java 方法对该地图(按值)进行了排序,如下所示:
public static Map sort(Map unsortMap, Order order) {
List list = new LinkedList(unsortMap.entrySet());
comparator = new Comparator() {
public int compare(Object o1, Object o2) {
return ((Comparable) ((Map.Entry) (o1)).getValue()).compareTo(((Map.Entry) (o2)).getValue());
}
}
Collections.sort(list, comparator);
Map sortedMap = new LinkedHashMap();
for (Iterator it = list.iterator(); it.hasNext();) {
Map.Entry entry = (Map.Entry) it.next();
sortedMap.put(entry.getKey(), entry.getValue());
}
return sortedMap;
}
不幸的是,我的问题是我使用 zipWithIndex
方法遍历地图时丢失了订单。
这是当前结果:
Key - Value - Index
WA - 41 - 4
BA - 66 - 0
BM - 52 - 2
DP - 0 - 6
JTM - 0 - 7
TN - 59 - 1
WP - 46 - 3
SM - 0 - 5
如您所见,它没有排序,但应该是这样的:
Key - Value - Index
BA - 66 - 0
TN - 59 - 1
BM - 52 - 2
WP - 46 - 3
WA - 41 - 4
SM - 0 - 5
DP - 0 - 6
JTM - 0 - 7
所以问题是:
- 如何以原始顺序遍历带有索引的地图?
我想出了第一个问题。这是工作循环代码:
@for(((key, value), currentIndex) <- m.lastMonthRanking.view.zipWithIndex) {
<li>
<span @if(session().get("email").equals(key)){ class="label label-info" style="font-size: 100%; display: grid"}>@key
<span class="badge">@value</span>
</span>
</li>
}
- 如何访问当前迭代的 next/previous 元素 after/before?
编辑
我有一张地图,其中键是 @userName
(字符串),@value
是(整数)。
我想打印 @value
订购的列表 <ol><li>@userName (@value)</li></ol>
。如果值在许多用户中重复,我想以其他方式打印这些元素,所以我必须知道列表中的 next/previous 元素是否具有相同的值。通常在 java 列表中我会做这样的事情:
for (int i = 0; i < CrunchifyList.size(); i++) {
System.out.println(CrunchifyList.get(i-1) + " is previous element");
System.out.println(CrunchifyList.get(i) + " is current element");
System.out.println(CrunchifyList.get(i+1) + " is next element");
}
但现在我需要在 scala 和地图中执行此操作。 请帮忙
关于第一个问题,你应该使用维护插入顺序的地图。一个例子是 scala.collection.immutable.ListMap
.
@ import scala.collection.immutable.{HashMap, ListMap}
import scala.collection.immutable.{HashMap, ListMap}
@ val l = 1 to 5
l: collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5)
@ val hm = HashMap(l.zipWithIndex: _*)
hm: HashMap[Int, Int] = Map(5 -> 4, 1 -> 0, 2 -> 1, 3 -> 2, 4 -> 3)
@ val lm = ListMap(l.zipWithIndex: _*)
lm: ListMap[Int, Int] = Map(1 -> 0, 2 -> 1, 3 -> 2, 4 -> 3, 5 -> 4)
@for(((key, value), currentIndex) <- m.myMap.iterator.zipWithIndex) {