2015-03-19 58 views
1

我創建了一個名爲Pair的類,該類是LR的通用類型,它基本上允許我存儲對。使用Java中的通用類創建的排序列表列表

我正在使用Arraylist來存儲類型Pair,但我不知道如何根據key/value排列(並潛在搜索所有元素)數組列表,並打印ArrayList。

ArrayList<Pair> a = new ArrayList<Pair>(); 

    Pair p = new Pair(1,1); 
    a.add(p); 
    a.add(new Pair(1,3)); 

    //System.out.println(help please); 

下面是Pair

class Pair<L,R> { 

     L left; 
     R right; 

     public Pair(L left, R right) { 
     this.left = left; 
     this.right = right; 
     } 

     public L getLeft() { return left; } 
     public R getRight() { return right; } 

     @Override 
     public int hashCode() { return left.hashCode()^right.hashCode(); } 

     @Override 
     public boolean equals(Object o) { 
     if (!(o instanceof Pair)) return false; 
     Pair pairo = (Pair) o; 
     return this.left.equals(pairo.getLeft()) && 
       this.right.equals(pairo.getRight()); 
     } 




    } 
+0

聲明是否包含原始'Pair'情況下,會給你帶來麻煩的'ArrayList'?你編譯過嗎? – Dragan 2015-03-19 11:21:19

+0

您在這裏使用了很多原始類型:例如,'Pair'而不是'Pair '。你應該真的解決這個問題,以確保你的類型安全。 – 2015-03-19 12:05:34

回答

2

下面是一個適用於您的工作代碼示例(它使用了一些Java 8功能,但如果您限制爲較低版本,則可以將它們換出)。希望這可以幫助!

感謝, 鄧肯

package com.hiveit; 

import java.util.ArrayList; 
import java.util.List; 
import java.util.stream.Collectors; 

public class Pair<L extends Comparable<L>, R extends Comparable<R>> implements Comparable<Pair<L, R>> { 

    L left; 
    R right; 

    public Pair(final L left, final R right) { 
    this.left = left; 
    this.right = right; 
    } 

    public L getLeft() { 
    return left; 
    } 

    public R getRight() { 
    return right; 
    } 

    @Override 
    public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + (left == null ? 0 : left.hashCode()); 
    result = prime * result + (right == null ? 0 : right.hashCode()); 
    return result; 
    } 

    @Override 
    public boolean equals(final Object obj) { 
    if (this == obj) { 
     return true; 
    } 
    if (obj == null) { 
     return false; 
    } 
    if (getClass() != obj.getClass()) { 
     return false; 
    } 
    final Pair<?, ?> other = (Pair<?, ?>) obj; 
    if (left == null) { 
     if (other.left != null) { 
     return false; 
     } 
    } else if (!left.equals(other.left)) { 
     return false; 
    } 
    if (right == null) { 
     if (other.right != null) { 
     return false; 
     } 
    } else if (!right.equals(other.right)) { 
     return false; 
    } 
    return true; 
    } 

    @Override 
    public int compareTo(final Pair<L, R> other) { 

    final int compareLeft = left.compareTo(other.left); 

    if (compareLeft != 0) { 
     return compareLeft; 
    } 

    return right.compareTo(other.right); 
    } 

    @Override 
    public String toString() { 
    return "Pair [left=" + left + ", right=" + right + "]"; 
    } 

    public static String listToString(final List<?> list) { 
    return list.stream().map((pair) -> { 
     return pair.toString(); 
    }).collect(Collectors.joining(", ")); 
    } 

    public static void main(final String[] args) { 

    final List<Pair<Integer, Integer>> a = new ArrayList<>(); 

    a.add(new Pair<>(1, 1)); 
    a.add(new Pair<>(2, 1)); 
    a.add(new Pair<>(2, 3)); 
    a.add(new Pair<>(1, 2)); 
    a.add(new Pair<>(1, 3)); 
    a.add(new Pair<>(2, 2)); 

    final List<Pair<Integer, Integer>> sortedByKey = new ArrayList<>(a); 
    sortedByKey.sort((o1, o2) -> { 
     return o1.getLeft().compareTo(o2.getLeft()); 
    }); 

    sortedByKey.stream().map((pair) -> { 
     return pair.toString(); 
    }).collect(Collectors.joining(", ")); 

    final List<Pair<Integer, Integer>> sortedByValue = new ArrayList<>(a); 
    sortedByValue.sort((o1, o2) -> { 
     return o1.getRight().compareTo(o2.getRight()); 
    }); 

    final List<Pair<Integer, Integer>> sortedByKeyAndValue = new ArrayList<>(a); 
    sortedByKeyAndValue.sort((o1, o2) -> { 
     return o1.compareTo(o2); 
    }); 

    System.out.println("Original     = " + listToString(a)); 
    System.out.println("Sorted by Left   = " + listToString(sortedByKey)); 
    System.out.println("Sorted by Right   = " + listToString(sortedByValue)); 
    System.out.println("Sorted by Left then Right = " + listToString(sortedByKeyAndValue)); 

    } 
} 
+0

完美。感謝您花時間回答我的問題。真的很感激它。 – user3353723 2015-03-20 08:13:40

2

你的Pair類可以例如implement Comparator<Pair>接口。之後,您執行方法

@Override 
public int compare(Pair o1, Pair o2) { 
    // here you need to implement how one Pair can be compared to another 
    // in the scope of ordering them 
    // you need to fulfil the contract of the Comparator.compare interface 
} 
0

請勿使用Pair類。如果您需要的是使用TreeMap對帶有泛型類型的鍵/值對進行排序,遍歷和有效的集合。

+0

此外,你的代碼不喜歡它編譯給我。例如,第一個聲明應該是'ArrayList > a = new ArrayList >();'。如果使用Java 8,也可以使用類型推斷。 – 2015-03-19 11:28:25

+0

使用'TreeMap'將無法處理具有相同'left'值的多個對的情況。這不是一回事。 – 2015-03-19 12:04:22

+0

非常真實!但他確實提到了關鍵/價值。這個概念本身就是關鍵是獨特的,並指向一個價值。所以如果他真的只想要一個元組數組,那麼你是對的,但是如果他想要鍵/值,我會把他指向正確的方向。很難說他對這個話題有多熟悉,或者他的實際問題是什麼,但鑑於排序和比較者是相當基本的(而且他沒有提出),我認爲這很好。 – 2015-03-19 12:43:09