我有一个元素列表,每个元素都有一个地图,包含Integer键和任何Object值,并不重要。然后,对于列表中的每个元素,我想在元素映射中进行排列。
<Map<Integer,Object> myMap= {[0,null] [1,A]; [2,B]; [3,C]; [4,D]};
在一些操作之后,我有一个排列图,如:
Map<Integer,Integer> changes = {1=2, 2=3, 3=4, 4=1}
所以我想重新安排我的列表
Map<Integer,Object> myMap = {[0,null] [1,B]; [2,C]; [3,D]; [4,A]};
可以使用保存myList数据的其他列表来完成worgout,然后根据排列设置我的List-s项吗?
我可以使用如下的帮助列表来完成:
Map<Integer,Object> helperMap= {[0,null] [1,A]; [2,B]; [3,C]; [4,D]};
然后
changes.forEach((key,value) ->{
myList.set(key,helperList.get(value));
}
我正在考虑只使用一个变量来存储一个元素,但我无法做到这一点,而且我真的没有更好的想法。 如果存在,你能否建议我一个比这更好的想法。
注意:我知道有一个Collections.rotate方法,它做了类似的事情,但我列表中的元素非常复杂,我想按其ID重新排序。 每次重新排序后,编号系统(或元素ID)都不会只改变数据本身,每次编号从1升序到elements.size() - 1。
编辑:反转列表中的值以更好地表示我拥有的数据。
Edit2:列表被替换为map,所以在每个地图的列表中我想要这样做。
答案 0 :(得分:0)
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import javafx.util.Pair;
public class T2 {
public static void main(final String... args) {
Map<Integer, Object> first = new HashMap<>();
first.put(0, null);
List<Map<Integer, Object>> myList = List.of(
first,
Map.of(1,"A"),
Map.of(2,"B"),
Map.of(3,"C"),
Map.of(4,"D"));
Map<Integer,Integer> changes = Map.of(0,0,1,2, 2,3, 3,4, 4,1);
Map<Integer,Integer> flipped = changes.entrySet().stream().collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey));
System.out.println(IntStream.range(0, myList.size())
.mapToObj(p -> new Pair<>(myList.get(p), flipped.get(p)))
.sorted(Comparator.comparingInt(p -> p.getValue()))
.map(p -> p.getKey())
.collect(Collectors.toList()));
}
}
输出:
[{0=null}, {2=B}, {3=C}, {4=D}, {1=A}]
第一位是必需的,因为Java 9 Map.of不支持空值,Map.of和List.of以外的代码用于使数据结构与Java 8兼容