001/* 002 * Copyright (C) 2008 The Guava Authors 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017package com.google.common.collect; 018 019import com.google.common.annotations.GwtCompatible; 020import com.google.common.base.Objects; 021 022import java.util.Collection; 023import java.util.Map; 024import java.util.Set; 025 026import javax.annotation.Nullable; 027 028/** 029 * A collection that associates an ordered pair of keys, called a row key and a 030 * column key, with a single value. A table may be sparse, with only a small 031 * fraction of row key / column key pairs possessing a corresponding value. 032 * 033 * <p>The mappings corresponding to a given row key may be viewed as a {@link 034 * Map} whose keys are the columns. The reverse is also available, associating a 035 * column with a row key / value map. Note that, in some implementations, data 036 * access by column key may have fewer supported operations or worse performance 037 * than data access by row key. 038 * 039 * <p>The methods returning collections or maps always return views of the 040 * underlying table. Updating the table can change the contents of those 041 * collections, and updating the collections will change the table. 042 * 043 * <p>All methods that modify the table are optional, and the views returned by 044 * the table may or may not be modifiable. When modification isn't supported, 045 * those methods will throw an {@link UnsupportedOperationException}. 046 * 047 * <p>See the Guava User Guide article on <a href= 048 * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#table"> 049 * {@code Table}</a>. 050 * 051 * @author Jared Levy 052 * @param <R> the type of the table row keys 053 * @param <C> the type of the table column keys 054 * @param <V> the type of the mapped values 055 * @since 7.0 056 */ 057@GwtCompatible 058public interface Table<R, C, V> { 059 // TODO(jlevy): Consider adding methods similar to ConcurrentMap methods. 060 061 // Accessors 062 063 /** 064 * Returns {@code true} if the table contains a mapping with the specified 065 * row and column keys. 066 * 067 * @param rowKey key of row to search for 068 * @param columnKey key of column to search for 069 */ 070 boolean contains(@Nullable Object rowKey, @Nullable Object columnKey); 071 072 /** 073 * Returns {@code true} if the table contains a mapping with the specified 074 * row key. 075 * 076 * @param rowKey key of row to search for 077 */ 078 boolean containsRow(@Nullable Object rowKey); 079 080 /** 081 * Returns {@code true} if the table contains a mapping with the specified 082 * column. 083 * 084 * @param columnKey key of column to search for 085 */ 086 boolean containsColumn(@Nullable Object columnKey); 087 088 /** 089 * Returns {@code true} if the table contains a mapping with the specified 090 * value. 091 * 092 * @param value value to search for 093 */ 094 boolean containsValue(@Nullable Object value); 095 096 /** 097 * Returns the value corresponding to the given row and column keys, or 098 * {@code null} if no such mapping exists. 099 * 100 * @param rowKey key of row to search for 101 * @param columnKey key of column to search for 102 */ 103 V get(@Nullable Object rowKey, @Nullable Object columnKey); 104 105 /** Returns {@code true} if the table contains no mappings. */ 106 boolean isEmpty(); 107 108 /** 109 * Returns the number of row key / column key / value mappings in the table. 110 */ 111 int size(); 112 113 /** 114 * Compares the specified object with this table for equality. Two tables are 115 * equal when their cell views, as returned by {@link #cellSet}, are equal. 116 */ 117 @Override 118 boolean equals(@Nullable Object obj); 119 120 /** 121 * Returns the hash code for this table. The hash code of a table is defined 122 * as the hash code of its cell view, as returned by {@link #cellSet}. 123 */ 124 @Override 125 int hashCode(); 126 127 // Mutators 128 129 /** Removes all mappings from the table. */ 130 void clear(); 131 132 /** 133 * Associates the specified value with the specified keys. If the table 134 * already contained a mapping for those keys, the old value is replaced with 135 * the specified value. 136 * 137 * @param rowKey row key that the value should be associated with 138 * @param columnKey column key that the value should be associated with 139 * @param value value to be associated with the specified keys 140 * @return the value previously associated with the keys, or {@code null} if 141 * no mapping existed for the keys 142 */ 143 @Nullable 144 V put(R rowKey, C columnKey, V value); 145 146 /** 147 * Copies all mappings from the specified table to this table. The effect is 148 * equivalent to calling {@link #put} with each row key / column key / value 149 * mapping in {@code table}. 150 * 151 * @param table the table to add to this table 152 */ 153 void putAll(Table<? extends R, ? extends C, ? extends V> table); 154 155 /** 156 * Removes the mapping, if any, associated with the given keys. 157 * 158 * @param rowKey row key of mapping to be removed 159 * @param columnKey column key of mapping to be removed 160 * @return the value previously associated with the keys, or {@code null} if 161 * no such value existed 162 */ 163 @Nullable 164 V remove(@Nullable Object rowKey, @Nullable Object columnKey); 165 166 // Views 167 168 /** 169 * Returns a view of all mappings that have the given row key. For each row 170 * key / column key / value mapping in the table with that row key, the 171 * returned map associates the column key with the value. If no mappings in 172 * the table have the provided row key, an empty map is returned. 173 * 174 * <p>Changes to the returned map will update the underlying table, and vice 175 * versa. 176 * 177 * @param rowKey key of row to search for in the table 178 * @return the corresponding map from column keys to values 179 */ 180 Map<C, V> row(R rowKey); 181 182 /** 183 * Returns a view of all mappings that have the given column key. For each row 184 * key / column key / value mapping in the table with that column key, the 185 * returned map associates the row key with the value. If no mappings in the 186 * table have the provided column key, an empty map is returned. 187 * 188 * <p>Changes to the returned map will update the underlying table, and vice 189 * versa. 190 * 191 * @param columnKey key of column to search for in the table 192 * @return the corresponding map from row keys to values 193 */ 194 Map<R, V> column(C columnKey); 195 196 /** 197 * Returns a set of all row key / column key / value triplets. Changes to the 198 * returned set will update the underlying table, and vice versa. The cell set 199 * does not support the {@code add} or {@code addAll} methods. 200 * 201 * @return set of table cells consisting of row key / column key / value 202 * triplets 203 */ 204 Set<Cell<R, C, V>> cellSet(); 205 206 /** 207 * Returns a set of row keys that have one or more values in the table. 208 * Changes to the set will update the underlying table, and vice versa. 209 * 210 * @return set of row keys 211 */ 212 Set<R> rowKeySet(); 213 214 /** 215 * Returns a set of column keys that have one or more values in the table. 216 * Changes to the set will update the underlying table, and vice versa. 217 * 218 * @return set of column keys 219 */ 220 Set<C> columnKeySet(); 221 222 /** 223 * Returns a collection of all values, which may contain duplicates. Changes 224 * to the returned collection will update the underlying table, and vice 225 * versa. 226 * 227 * @return collection of values 228 */ 229 Collection<V> values(); 230 231 /** 232 * Returns a view that associates each row key with the corresponding map from 233 * column keys to values. Changes to the returned map will update this table. 234 * The returned map does not support {@code put()} or {@code putAll()}, or 235 * {@code setValue()} on its entries. 236 * 237 * <p>In contrast, the maps returned by {@code rowMap().get()} have the same 238 * behavior as those returned by {@link #row}. Those maps may support {@code 239 * setValue()}, {@code put()}, and {@code putAll()}. 240 * 241 * @return a map view from each row key to a secondary map from column keys to 242 * values 243 */ 244 Map<R, Map<C, V>> rowMap(); 245 246 /** 247 * Returns a view that associates each column key with the corresponding map 248 * from row keys to values. Changes to the returned map will update this 249 * table. The returned map does not support {@code put()} or {@code putAll()}, 250 * or {@code setValue()} on its entries. 251 * 252 * <p>In contrast, the maps returned by {@code columnMap().get()} have the 253 * same behavior as those returned by {@link #column}. Those maps may support 254 * {@code setValue()}, {@code put()}, and {@code putAll()}. 255 * 256 * @return a map view from each column key to a secondary map from row keys to 257 * values 258 */ 259 Map<C, Map<R, V>> columnMap(); 260 261 /** 262 * Row key / column key / value triplet corresponding to a mapping in a table. 263 * 264 * @since 7.0 265 */ 266 interface Cell<R, C, V> { 267 /** 268 * Returns the row key of this cell. 269 */ 270 @Nullable 271 R getRowKey(); 272 273 /** 274 * Returns the column key of this cell. 275 */ 276 @Nullable 277 C getColumnKey(); 278 279 /** 280 * Returns the value of this cell. 281 */ 282 @Nullable 283 V getValue(); 284 285 /** 286 * Compares the specified object with this cell for equality. Two cells are 287 * equal when they have equal row keys, column keys, and values. 288 */ 289 @Override 290 boolean equals(@Nullable Object obj); 291 292 /** 293 * Returns the hash code of this cell. 294 * 295 * <p>The hash code of a table cell is equal to {@link 296 * Objects#hashCode}{@code (e.getRowKey(), e.getColumnKey(), e.getValue())}. 297 */ 298 @Override 299 int hashCode(); 300 } 301}