001package com.nativelibs4java.util; 002 003/** 004 * 005 * @author ochafik 006 */ 007import java.util.Map; 008 009public class Pair<U, V> implements Comparable<Pair<U, V>>, Map.Entry<U, V> { 010 private U first; 011 private V second; 012 013 public Pair(U first, V second) { 014 this.first = first; 015 this.second = second; 016 } 017 018 public Pair() {} 019 020 public U getFirst() { 021 return first; 022 } 023 024 public V getSecond() { 025 return second; 026 } 027 028 public void setFirst(U first) { 029 this.first = first; 030 } 031 032 public void setSecond(V second) { 033 this.second = second; 034 } 035 036 @SuppressWarnings("unchecked") 037 public int compareTo(Pair<U, V> o) { 038 Comparable<U> cu = (Comparable<U>)getFirst(); 039 if (cu == null) { 040 if (first != null) 041 return 1; 042 } else { 043 int d = cu.compareTo(o.getFirst()); 044 if (d != 0) 045 return d; 046 } 047 048 Comparable<V> cv = (Comparable<V>)getSecond(); 049 if (cv == null) 050 return second != null ? 1 : -1; 051 return cv.compareTo(o.getSecond()); 052 } 053 054 @Override 055 public String toString() { 056 return "Pair("+first+", "+second+")"; 057 } 058 059 public U getKey() { 060 return first; 061 } 062 063 public V getValue() { 064 return second; 065 } 066 067 public V setValue(V value) { 068 V oldValue = second; 069 second = value; 070 return oldValue; 071 } 072 073 @Override 074 public int hashCode() { 075 final int prime = 31; 076 int result = 1; 077 result = prime * result + ((first == null) ? 0 : first.hashCode()); 078 result = prime * result + ((second == null) ? 0 : second.hashCode()); 079 return result; 080 } 081 082 @Override 083 public boolean equals(Object obj) { 084 if (this == obj) 085 return true; 086 if (obj == null) 087 return false; 088 if (getClass() != obj.getClass()) 089 return false; 090 final Pair<?, ?> other = (Pair<?, ?>) obj; 091 if (first == null) { 092 if (other.first != null) 093 return false; 094 } else if (!first.equals(other.first)) 095 return false; 096 if (second == null) { 097 if (other.second != null) 098 return false; 099 } else if (!second.equals(other.second)) 100 return false; 101 return true; 102 } 103 104 public boolean isFull() { 105 return getFirst() != null && getSecond() != null; 106 } 107 108 public boolean isEmpty() { 109 return getFirst() == null && getSecond() == null; 110 } 111}