0

本质上,我的任务是编写两种方法:一种 zip 方法,它将包含两个通用反对列表的通用元组转换为由上述列表的元素组成的元组列表,以及一个 unzip 方法,它在另一个中执行相同的操作方向。IE:

({1, "banana", true}{asgard, 5.21e, "stupidhomework"})
=> unzip
{(1, asgard)("banana",5.21e)(true,"stupidhomework")}
=> zip
({1, "banana", true}{asgard, 5.21e, "stupidhomework"})

更复杂的是:列表是一个简单链接的不可变通用列表,其结构

List<T>
public final T       head;
public final List<T> tail;

...而且元组同样通用;元组的两个元素实际上可以是任何东西:

public class Tuple<A, B> {
public final A a;
public final B b;

所以这是我的问题:我不知道如何将元素放在第二层。例如,通常情况下,我会这样做——

   public static<A, B extends List> List unzip(Tuple<A, B> ListenTuple){
        List TupelnListe = new List(new Tuple(ListenTuple.a.head, ListenTuple.b.head));

- 为了获得我需要的元素,向下两层。不幸的是,因为 Tuple 是通用的,它不知道 ListenTuple.a 必须是一个 List,因此它有一个头。类似的问题出现在 zip 中,从元组中获取 a 和 b。哦,我不允许出于某种愚蠢的任意原因进行类型转换,尽管我不确定这对我有什么帮助。

...基本上,任何人都可以给我一个关于如何开始的指示吗?他们这周在课堂上基本上把我们扔进了仿制药,没有人明白。任何帮助将不胜感激。

4

2 回答 2

1

这行得通吗?

public static<A, B> List zip(Tuple<List<A>, List<B>> ListenTuple){

所以 A 和 B 是列表的元素,a, b 现在是列表。

我对 C++ 更熟悉,所以不确定这些差异是否会以某种方式阻止这种情况。

于 2013-01-11T01:29:02.387 回答
1

我会推荐这些签名:

public static <A, B> List<Tuple<A, B>> zip(Tuple<List<A>, List<B>> x);
public static <A, B> Tuple<List<A>, List<B>> unzip(List<Tuple<A, B>> x);

看看你能不能从那里弄清楚

于 2013-01-11T03:47:48.730 回答