001 package com.nativelibs4java.util;
002
003 /**
004 *
005 * @author ochafik
006 */
007 import java.util.Map;
008
009 public 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 }