【问题标题】:Java: permute data in a listJava:排列列表中的数据
【发布时间】:2017-09-05 11:32:22
【问题描述】:

我有一个元素列表,每个元素都有一个映射,有整数键和任何对象值,没关系。然后对于我列表中的每个元素,我想在元素映射中进行排列。

<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 : 列表替换为地图,因此在我想要执行此操作的每张地图的列表中。

【问题讨论】:

  • 你能把项目变成一个数字,代表它们在列表中的位置,所以如果你按这个数字对它们进行排序,它们就会按顺序排列,如果是这样,你可以这样做items.sort(Comparator.comparingInt(&lt;SOME CODE&gt;))而不是排序手动?
  • 这段代码不会给你语法错误吗?
  • @jrtapsell 在后台是复杂的结构,所以我不能只使用Collections.sort 使用自定义比较器。 @Jayesh 当然它不会编译,这只是一个展示我想要的模型。
  • 你不能在第二个数字上使用 compareInt 来按秒对列表进行排序,并将项目加入位置对
  • 列表中元素的数据结构是什么

标签: java list permutation


【解决方案1】:
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 不支持 null 值,除了 Map.of 和 List.of 用于制作数据结构的代码都与 Java 8 兼容

【讨论】:

  • 更新完成
  • 啊,所以您使用的是 Java9,我想知道 List.ofMap.of 是什么,因为我从未见过它们。我认为这不是我的解决方案,因为我必须在地图中置换值。我认为我的问题是错误的。
  • 分配第二个映射可能会容易得多,并且由于对象只是被重新排序,您不需要重新分配它们,因此 2 个映射的内存使用增加可能足够小,以至于比更复杂的代码要好。
  • 好吧,也许我会使用辅助地图解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-01
  • 2016-06-16
  • 1970-01-01
  • 1970-01-01
  • 2021-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多