1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * https://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18 /*
19 * This is not the original file distributed by the Apache Software Foundation
20 * It has been modified by the Hipparchus project
21 */
22 package org.hipparchus.util;
23
24
25 import java.util.Objects;
26
27 /**
28 * Generic pair.
29 * <p>
30 * Although the instances of this class are immutable, it is impossible
31 * to ensure that the references passed to the constructor will not be
32 * modified by the caller.
33 *
34 * @param <K> Key type.
35 * @param <V> Value type.
36 */
37 public class Pair<K, V> {
38 /** Key. */
39 private final K key;
40 /** Value. */
41 private final V value;
42
43 /**
44 * Create an entry representing a mapping from the specified key to the
45 * specified value.
46 *
47 * @param k Key (first element of the pair).
48 * @param v Value (second element of the pair).
49 */
50 public Pair(K k, V v) {
51 key = k;
52 value = v;
53 }
54
55 /**
56 * Create an entry representing the same mapping as the specified entry.
57 *
58 * @param entry Entry to copy.
59 */
60 public Pair(Pair<? extends K, ? extends V> entry) {
61 this(entry.getKey(), entry.getValue());
62 }
63
64 /**
65 * Get the key.
66 *
67 * @return the key (first element of the pair).
68 */
69 public K getKey() {
70 return key;
71 }
72
73 /**
74 * Get the value.
75 *
76 * @return the value (second element of the pair).
77 */
78 public V getValue() {
79 return value;
80 }
81
82 /**
83 * Get the first element of the pair.
84 *
85 * @return the first element of the pair.
86 */
87 public K getFirst() {
88 return key;
89 }
90
91 /**
92 * Get the second element of the pair.
93 *
94 * @return the second element of the pair.
95 */
96 public V getSecond() {
97 return value;
98 }
99
100 /**
101 * Compare the specified object with this entry for equality.
102 *
103 * @param o Object.
104 * @return {@code true} if the given object is also a map entry and
105 * the two entries represent the same mapping.
106 */
107 @Override
108 public boolean equals(Object o) {
109 if (this == o) {
110 return true;
111 }
112 if (!(o instanceof Pair)) {
113 return false;
114 }
115 Pair<?, ?> other = (Pair<?, ?>) o;
116 return (Objects.equals(key, other.key)) &&
117 (Objects.equals(value, other.value));
118 }
119
120 /**
121 * Compute a hash code.
122 *
123 * @return the hash code value.
124 */
125 @Override
126 public int hashCode() {
127 int result = key == null ? 0 : key.hashCode();
128
129 final int h = value == null ? 0 : value.hashCode();
130 result = 37 * result + h ^ (h >>> 16);
131
132 return result;
133 }
134
135 /** {@inheritDoc} */
136 @Override
137 public String toString() {
138 return "[" + getKey() + ", " + getValue() + "]";
139 }
140
141 /**
142 * Convenience factory method that calls the
143 * {@link #Pair(Object, Object) constructor}.
144 *
145 * @param <K> the key type
146 * @param <V> the value type
147 * @param k First element of the pair.
148 * @param v Second element of the pair.
149 * @return a new {@code Pair} containing {@code k} and {@code v}.
150 */
151 public static <K, V> Pair<K, V> create(K k, V v) {
152 return new Pair<>(k, v);
153 }
154 }