Java列表“拉链”

时间:2011-07-24 08:51:30

标签: java list

我有班级对:

public class Pair<T1, T2> {

    T1 info1;
    T2 info2;
    Pair<T1,T2> next;
    Pair<T1,T2> prev;

    Pair(T1 info1,T2 info2,Pair<T1,T2> next, Pair<T1,T2> prev) {
        this.info1 = info1;
        this.info2 = info2;
        this.next = next;
        this.prev = prev;
    }

    @Override
    public String toString() {
        return info1.toString() + info2.toString();
    }
}

我必须实现一个类Zipper,它有两个静态方法:zip和unzip。

zip将两个列表“压缩”为一个,并从两个中解压缩。

例如,当我有两个列表时:

list1: 1 , 2 ,3 ,4
list2: a, b, c, d 

zip必须返回:1a, 2b, 3c, 4d并且解压缩必须反转。

我不知道怎么做,有人可以帮助我吗?

2 个答案:

答案 0 :(得分:4)

  1. 不实现自己的LinkedList - 这项工作已经完成(迭代完成等)
  2. 使对只有2元组 那么你可以实现这样的方法(小心我在这里写的,在浏览器中 - 所以可能有拼写错误):
  3. 拉​​链:


    public class Zipper {
    
        static <T1, T2> List<Pair<T1, T2>> zip(List<T1> input1, List<T2> input2){
            int inputSize = input1.size();
            if(inputSize != input2.size()){
                throw  new IllegalArgumentException("Different input sizes.");
            }
            List<Pair<T1,T2>> output = new LinkedList<Pair<T1,T2>>();
            for (int i = 0; i < inputSize; ++i){
               output.add(new Pair<T1,T2>(input1.get(i), input2.get(i)));
            }
            return output;
        }
    
        static <T1,T2> Pair<List<T1>, List<T2>> unzip(List<Pair<T1, T2>> input){
            List<T1> output1 = new LinkedList<T1>();
            List<T2> output2 = new LinkedList<T2>();
            for(Pair<T1, T2> pair : input){
                output1.add(pair.getInfo1());
                output2.add(pair.getInfo2());
            }
            return new Pair<List<T1>, List<T2>>(output1, output2);
        }
    
        public static void main(String[] args) {
            List<Integer> input1 = Arrays.asList(1,2,3,4);
            List<Character> input2 = Arrays.asList('a','b','c','d');
            List<Pair<Integer, Character>> zipped = zip(input1, input2);
            System.out.println("zipped: " + zipped);
            Pair<List<Integer>,List<Character>> output = unzip(zipped);
            System.out.println("unzipped1: " + output.getInfo1());
            System.out.println("unzipped2: " + output.getInfo2());
        }
    }
    

    对:


    public class Pair<T1, T2> {
        T1 info1;
        T2 info2;
    
        public Pair(T1 info1, T2 info2) {
            this.info1 = info1;
            this.info2 = info2;
        }
    
        public T1 getInfo1() {
            return info1;
        }
    
        public T2 getInfo2() {
            return info2;
        }
    
        @Override
        public String toString() {
            return info1.toString() + info2.toString();
        }
    }
    

答案 1 :(得分:0)

你的问题有点不清楚,但我认为你的例子会更有用(其中[]表示列表,而Pair表示由“new Pair(x,y)”构成的对象):

Input: 
 list1: [1, 2, 3, 4]
 list2: [a, b, c, d]
Output:
   zip: [Pair<1, a>, Pair<2, b>, Pair<3, c>, Pair<4, d>]

也就是说,你最终会得到一对配对列表。

我不清楚(正如delnan指出的那样)是否必须创建链接列表。你被要求写的zip和unzip的签名是什么?