Java:列出列表中的数据

时间:2017-09-05 11:32:22

标签: java list permutation

我有一个元素列表,每个元素都有一个地图,包含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,所以在每个地图的列表中我想要这样做。

1 个答案:

答案 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}]

  • 首先它会翻转交换地图,因此{x = y}表示x变为y
  • 然后将对象与其新索引配对
  • 然后按新索引
  • 排序
  • 最后删除索引,只保留对象

第一位是必需的,因为Java 9 Map.of不支持空值,Map.of和List.of以外的代码用于使数据结构与Java 8兼容