1 /* 2 * Copyright (C) 2007 The Guava Authors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.google.common.collect; 18 19 import static com.google.common.base.Preconditions.checkArgument; 20 import static com.google.common.base.Preconditions.checkElementIndex; 21 import static com.google.common.base.Preconditions.checkNotNull; 22 import static com.google.common.base.Preconditions.checkPositionIndex; 23 import static com.google.common.base.Preconditions.checkPositionIndexes; 24 import static com.google.common.base.Preconditions.checkState; 25 26 import com.google.common.annotations.Beta; 27 import com.google.common.annotations.GwtCompatible; 28 import com.google.common.annotations.VisibleForTesting; 29 import com.google.common.base.Function; 30 import com.google.common.base.Objects; 31 import com.google.common.primitives.Ints; 32 33 import java.io.Serializable; 34 import java.util.AbstractList; 35 import java.util.AbstractSequentialList; 36 import java.util.ArrayList; 37 import java.util.Arrays; 38 import java.util.Collection; 39 import java.util.Collections; 40 import java.util.Iterator; 41 import java.util.LinkedList; 42 import java.util.List; 43 import java.util.ListIterator; 44 import java.util.NoSuchElementException; 45 import java.util.RandomAccess; 46 47 import javax.annotation.Nullable; 48 49 /** 50 * Static utility methods pertaining to {@link List} instances. Also see this 51 * class's counterparts {@link Sets} and {@link Maps}. 52 * 53 * @author Kevin Bourrillion 54 * @author Mike Bostock 55 * @author Louis Wasserman 56 * @since 2.0 (imported from Google Collections Library) 57 */ 58 @GwtCompatible 59 public final class Lists { Lists()60 private Lists() {} 61 62 // ArrayList 63 64 /** 65 * Creates a <i>mutable</i>, empty {@code ArrayList} instance. 66 * 67 * <p><b>Note:</b> if mutability is not required, use {@link 68 * ImmutableList#of()} instead. 69 * 70 * @return a new, empty {@code ArrayList} 71 */ 72 @GwtCompatible(serializable = true) newArrayList()73 public static <E> ArrayList<E> newArrayList() { 74 return new ArrayList<E>(); 75 } 76 77 /** 78 * Creates a <i>mutable</i> {@code ArrayList} instance containing the given 79 * elements. 80 * 81 * <p><b>Note:</b> if mutability is not required and the elements are 82 * non-null, use an overload of {@link ImmutableList#of()} (for varargs) or 83 * {@link ImmutableList#copyOf(Object[])} (for an array) instead. 84 * 85 * @param elements the elements that the list should contain, in order 86 * @return a new {@code ArrayList} containing those elements 87 */ 88 @GwtCompatible(serializable = true) newArrayList(E... elements)89 public static <E> ArrayList<E> newArrayList(E... elements) { 90 checkNotNull(elements); // for GWT 91 // Avoid integer overflow when a large array is passed in 92 int capacity = computeArrayListCapacity(elements.length); 93 ArrayList<E> list = new ArrayList<E>(capacity); 94 Collections.addAll(list, elements); 95 return list; 96 } 97 computeArrayListCapacity(int arraySize)98 @VisibleForTesting static int computeArrayListCapacity(int arraySize) { 99 checkArgument(arraySize >= 0); 100 101 // TODO(kevinb): Figure out the right behavior, and document it 102 return Ints.saturatedCast(5L + arraySize + (arraySize / 10)); 103 } 104 105 /** 106 * Creates a <i>mutable</i> {@code ArrayList} instance containing the given 107 * elements. 108 * 109 * <p><b>Note:</b> if mutability is not required and the elements are 110 * non-null, use {@link ImmutableList#copyOf(Iterator)} instead. 111 * 112 * @param elements the elements that the list should contain, in order 113 * @return a new {@code ArrayList} containing those elements 114 */ 115 @GwtCompatible(serializable = true) newArrayList(Iterable<? extends E> elements)116 public static <E> ArrayList<E> newArrayList(Iterable<? extends E> elements) { 117 checkNotNull(elements); // for GWT 118 // Let ArrayList's sizing logic work, if possible 119 return (elements instanceof Collection) 120 ? new ArrayList<E>(Collections2.cast(elements)) 121 : newArrayList(elements.iterator()); 122 } 123 124 /** 125 * Creates a <i>mutable</i> {@code ArrayList} instance containing the given 126 * elements. 127 * 128 * <p><b>Note:</b> if mutability is not required and the elements are 129 * non-null, use {@link ImmutableList#copyOf(Iterator)} instead. 130 * 131 * @param elements the elements that the list should contain, in order 132 * @return a new {@code ArrayList} containing those elements 133 */ 134 @GwtCompatible(serializable = true) newArrayList(Iterator<? extends E> elements)135 public static <E> ArrayList<E> newArrayList(Iterator<? extends E> elements) { 136 checkNotNull(elements); // for GWT 137 ArrayList<E> list = newArrayList(); 138 while (elements.hasNext()) { 139 list.add(elements.next()); 140 } 141 return list; 142 } 143 144 /** 145 * Creates an {@code ArrayList} instance backed by an array of the 146 * <i>exact</i> size specified; equivalent to 147 * {@link ArrayList#ArrayList(int)}. 148 * 149 * <p><b>Note:</b> if you know the exact size your list will be, consider 150 * using a fixed-size list ({@link Arrays#asList(Object[])}) or an {@link 151 * ImmutableList} instead of a growable {@link ArrayList}. 152 * 153 * <p><b>Note:</b> If you have only an <i>estimate</i> of the eventual size of 154 * the list, consider padding this estimate by a suitable amount, or simply 155 * use {@link #newArrayListWithExpectedSize(int)} instead. 156 * 157 * @param initialArraySize the exact size of the initial backing array for 158 * the returned array list ({@code ArrayList} documentation calls this 159 * value the "capacity") 160 * @return a new, empty {@code ArrayList} which is guaranteed not to resize 161 * itself unless its size reaches {@code initialArraySize + 1} 162 * @throws IllegalArgumentException if {@code initialArraySize} is negative 163 */ 164 @GwtCompatible(serializable = true) newArrayListWithCapacity( int initialArraySize)165 public static <E> ArrayList<E> newArrayListWithCapacity( 166 int initialArraySize) { 167 checkArgument(initialArraySize >= 0); // for GWT. 168 return new ArrayList<E>(initialArraySize); 169 } 170 171 /** 172 * Creates an {@code ArrayList} instance sized appropriately to hold an 173 * <i>estimated</i> number of elements without resizing. A small amount of 174 * padding is added in case the estimate is low. 175 * 176 * <p><b>Note:</b> If you know the <i>exact</i> number of elements the list 177 * will hold, or prefer to calculate your own amount of padding, refer to 178 * {@link #newArrayListWithCapacity(int)}. 179 * 180 * @param estimatedSize an estimate of the eventual {@link List#size()} of 181 * the new list 182 * @return a new, empty {@code ArrayList}, sized appropriately to hold the 183 * estimated number of elements 184 * @throws IllegalArgumentException if {@code estimatedSize} is negative 185 */ 186 @GwtCompatible(serializable = true) newArrayListWithExpectedSize( int estimatedSize)187 public static <E> ArrayList<E> newArrayListWithExpectedSize( 188 int estimatedSize) { 189 return new ArrayList<E>(computeArrayListCapacity(estimatedSize)); 190 } 191 192 // LinkedList 193 194 /** 195 * Creates an empty {@code LinkedList} instance. 196 * 197 * <p><b>Note:</b> if you need an immutable empty {@link List}, use 198 * {@link ImmutableList#of()} instead. 199 * 200 * @return a new, empty {@code LinkedList} 201 */ 202 @GwtCompatible(serializable = true) newLinkedList()203 public static <E> LinkedList<E> newLinkedList() { 204 return new LinkedList<E>(); 205 } 206 207 /** 208 * Creates a {@code LinkedList} instance containing the given elements. 209 * 210 * @param elements the elements that the list should contain, in order 211 * @return a new {@code LinkedList} containing those elements 212 */ 213 @GwtCompatible(serializable = true) newLinkedList( Iterable<? extends E> elements)214 public static <E> LinkedList<E> newLinkedList( 215 Iterable<? extends E> elements) { 216 LinkedList<E> list = newLinkedList(); 217 for (E element : elements) { 218 list.add(element); 219 } 220 return list; 221 } 222 223 /** 224 * Returns an unmodifiable list containing the specified first element and 225 * backed by the specified array of additional elements. Changes to the {@code 226 * rest} array will be reflected in the returned list. Unlike {@link 227 * Arrays#asList}, the returned list is unmodifiable. 228 * 229 * <p>This is useful when a varargs method needs to use a signature such as 230 * {@code (Foo firstFoo, Foo... moreFoos)}, in order to avoid overload 231 * ambiguity or to enforce a minimum argument count. 232 * 233 * <p>The returned list is serializable and implements {@link RandomAccess}. 234 * 235 * @param first the first element 236 * @param rest an array of additional elements, possibly empty 237 * @return an unmodifiable list containing the specified elements 238 */ asList(@ullable E first, E[] rest)239 public static <E> List<E> asList(@Nullable E first, E[] rest) { 240 return new OnePlusArrayList<E>(first, rest); 241 } 242 243 /** @see Lists#asList(Object, Object[]) */ 244 private static class OnePlusArrayList<E> extends AbstractList<E> 245 implements Serializable, RandomAccess { 246 final E first; 247 final E[] rest; 248 OnePlusArrayList(@ullable E first, E[] rest)249 OnePlusArrayList(@Nullable E first, E[] rest) { 250 this.first = first; 251 this.rest = checkNotNull(rest); 252 } size()253 @Override public int size() { 254 return rest.length + 1; 255 } get(int index)256 @Override public E get(int index) { 257 // check explicitly so the IOOBE will have the right message 258 checkElementIndex(index, size()); 259 return (index == 0) ? first : rest[index - 1]; 260 } 261 private static final long serialVersionUID = 0; 262 } 263 264 /** 265 * Returns an unmodifiable list containing the specified first and second 266 * element, and backed by the specified array of additional elements. Changes 267 * to the {@code rest} array will be reflected in the returned list. Unlike 268 * {@link Arrays#asList}, the returned list is unmodifiable. 269 * 270 * <p>This is useful when a varargs method needs to use a signature such as 271 * {@code (Foo firstFoo, Foo secondFoo, Foo... moreFoos)}, in order to avoid 272 * overload ambiguity or to enforce a minimum argument count. 273 * 274 * <p>The returned list is serializable and implements {@link RandomAccess}. 275 * 276 * @param first the first element 277 * @param second the second element 278 * @param rest an array of additional elements, possibly empty 279 * @return an unmodifiable list containing the specified elements 280 */ asList( @ullable E first, @Nullable E second, E[] rest)281 public static <E> List<E> asList( 282 @Nullable E first, @Nullable E second, E[] rest) { 283 return new TwoPlusArrayList<E>(first, second, rest); 284 } 285 286 /** @see Lists#asList(Object, Object, Object[]) */ 287 private static class TwoPlusArrayList<E> extends AbstractList<E> 288 implements Serializable, RandomAccess { 289 final E first; 290 final E second; 291 final E[] rest; 292 TwoPlusArrayList(@ullable E first, @Nullable E second, E[] rest)293 TwoPlusArrayList(@Nullable E first, @Nullable E second, E[] rest) { 294 this.first = first; 295 this.second = second; 296 this.rest = checkNotNull(rest); 297 } size()298 @Override public int size() { 299 return rest.length + 2; 300 } get(int index)301 @Override public E get(int index) { 302 switch (index) { 303 case 0: 304 return first; 305 case 1: 306 return second; 307 default: 308 // check explicitly so the IOOBE will have the right message 309 checkElementIndex(index, size()); 310 return rest[index - 2]; 311 } 312 } 313 private static final long serialVersionUID = 0; 314 } 315 316 /** 317 * Returns a list that applies {@code function} to each element of {@code 318 * fromList}. The returned list is a transformed view of {@code fromList}; 319 * changes to {@code fromList} will be reflected in the returned list and vice 320 * versa. 321 * 322 * <p>Since functions are not reversible, the transform is one-way and new 323 * items cannot be stored in the returned list. The {@code add}, 324 * {@code addAll} and {@code set} methods are unsupported in the returned 325 * list. 326 * 327 * <p>The function is applied lazily, invoked when needed. This is necessary 328 * for the returned list to be a view, but it means that the function will be 329 * applied many times for bulk operations like {@link List#contains} and 330 * {@link List#hashCode}. For this to perform well, {@code function} should be 331 * fast. To avoid lazy evaluation when the returned list doesn't need to be a 332 * view, copy the returned list into a new list of your choosing. 333 * 334 * <p>If {@code fromList} implements {@link RandomAccess}, so will the 335 * returned list. The returned list always implements {@link Serializable}, 336 * but serialization will succeed only when {@code fromList} and 337 * {@code function} are serializable. The returned list is threadsafe if the 338 * supplied list and function are. 339 * 340 * <p>If only a {@code Collection} or {@code Iterable} input is available, use 341 * {@link Collections2#transform} or {@link Iterables#transform}. 342 */ transform( List<F> fromList, Function<? super F, ? extends T> function)343 public static <F, T> List<T> transform( 344 List<F> fromList, Function<? super F, ? extends T> function) { 345 return (fromList instanceof RandomAccess) 346 ? new TransformingRandomAccessList<F, T>(fromList, function) 347 : new TransformingSequentialList<F, T>(fromList, function); 348 } 349 350 /** 351 * Implementation of a sequential transforming list. 352 * 353 * @see Lists#transform 354 */ 355 private static class TransformingSequentialList<F, T> 356 extends AbstractSequentialList<T> implements Serializable { 357 final List<F> fromList; 358 final Function<? super F, ? extends T> function; 359 TransformingSequentialList( List<F> fromList, Function<? super F, ? extends T> function)360 TransformingSequentialList( 361 List<F> fromList, Function<? super F, ? extends T> function) { 362 this.fromList = checkNotNull(fromList); 363 this.function = checkNotNull(function); 364 } 365 /** 366 * The default implementation inherited is based on iteration and removal of 367 * each element which can be overkill. That's why we forward this call 368 * directly to the backing list. 369 */ clear()370 @Override public void clear() { 371 fromList.clear(); 372 } size()373 @Override public int size() { 374 return fromList.size(); 375 } listIterator(final int index)376 @Override public ListIterator<T> listIterator(final int index) { 377 final ListIterator<F> delegate = fromList.listIterator(index); 378 return new ListIterator<T>() { 379 @Override 380 public void add(T e) { 381 throw new UnsupportedOperationException(); 382 } 383 384 @Override 385 public boolean hasNext() { 386 return delegate.hasNext(); 387 } 388 389 @Override 390 public boolean hasPrevious() { 391 return delegate.hasPrevious(); 392 } 393 394 @Override 395 public T next() { 396 return function.apply(delegate.next()); 397 } 398 399 @Override 400 public int nextIndex() { 401 return delegate.nextIndex(); 402 } 403 404 @Override 405 public T previous() { 406 return function.apply(delegate.previous()); 407 } 408 409 @Override 410 public int previousIndex() { 411 return delegate.previousIndex(); 412 } 413 414 @Override 415 public void remove() { 416 delegate.remove(); 417 } 418 419 @Override 420 public void set(T e) { 421 throw new UnsupportedOperationException("not supported"); 422 } 423 }; 424 } 425 426 private static final long serialVersionUID = 0; 427 } 428 429 /** 430 * Implementation of a transforming random access list. We try to make as many 431 * of these methods pass-through to the source list as possible so that the 432 * performance characteristics of the source list and transformed list are 433 * similar. 434 * 435 * @see Lists#transform 436 */ 437 private static class TransformingRandomAccessList<F, T> 438 extends AbstractList<T> implements RandomAccess, Serializable { 439 final List<F> fromList; 440 final Function<? super F, ? extends T> function; 441 442 TransformingRandomAccessList( 443 List<F> fromList, Function<? super F, ? extends T> function) { 444 this.fromList = checkNotNull(fromList); 445 this.function = checkNotNull(function); 446 } 447 @Override public void clear() { 448 fromList.clear(); 449 } 450 @Override public T get(int index) { 451 return function.apply(fromList.get(index)); 452 } 453 @Override public boolean isEmpty() { 454 return fromList.isEmpty(); 455 } 456 @Override public T remove(int index) { 457 return function.apply(fromList.remove(index)); 458 } 459 @Override public int size() { 460 return fromList.size(); 461 } 462 private static final long serialVersionUID = 0; 463 } 464 465 /** 466 * Returns consecutive {@linkplain List#subList(int, int) sublists} of a list, 467 * each of the same size (the final list may be smaller). For example, 468 * partitioning a list containing {@code [a, b, c, d, e]} with a partition 469 * size of 3 yields {@code [[a, b, c], [d, e]]} -- an outer list containing 470 * two inner lists of three and two elements, all in the original order. 471 * 472 * <p>The outer list is unmodifiable, but reflects the latest state of the 473 * source list. The inner lists are sublist views of the original list, 474 * produced on demand using {@link List#subList(int, int)}, and are subject 475 * to all the usual caveats about modification as explained in that API. 476 * 477 * @param list the list to return consecutive sublists of 478 * @param size the desired size of each sublist (the last may be 479 * smaller) 480 * @return a list of consecutive sublists 481 * @throws IllegalArgumentException if {@code partitionSize} is nonpositive 482 */ 483 public static <T> List<List<T>> partition(List<T> list, int size) { 484 checkNotNull(list); 485 checkArgument(size > 0); 486 return (list instanceof RandomAccess) 487 ? new RandomAccessPartition<T>(list, size) 488 : new Partition<T>(list, size); 489 } 490 491 private static class Partition<T> extends AbstractList<List<T>> { 492 final List<T> list; 493 final int size; 494 495 Partition(List<T> list, int size) { 496 this.list = list; 497 this.size = size; 498 } 499 500 @Override public List<T> get(int index) { 501 int listSize = size(); 502 checkElementIndex(index, listSize); 503 int start = index * size; 504 int end = Math.min(start + size, list.size()); 505 return list.subList(start, end); 506 } 507 508 @Override public int size() { 509 // TODO(user): refactor to common.math.IntMath.divide 510 int result = list.size() / size; 511 if (result * size != list.size()) { 512 result++; 513 } 514 return result; 515 } 516 517 @Override public boolean isEmpty() { 518 return list.isEmpty(); 519 } 520 } 521 522 private static class RandomAccessPartition<T> extends Partition<T> 523 implements RandomAccess { 524 RandomAccessPartition(List<T> list, int size) { 525 super(list, size); 526 } 527 } 528 529 /** 530 * Returns a view of the specified string as an immutable list of {@code 531 * Character} values. 532 * 533 * @since 7.0 534 */ 535 @Beta public static ImmutableList<Character> charactersOf(String string) { 536 return new StringAsImmutableList(checkNotNull(string)); 537 } 538 539 @SuppressWarnings("serial") // serialized using ImmutableList serialization 540 private static final class StringAsImmutableList 541 extends ImmutableList<Character> { 542 543 private final String string; 544 545 StringAsImmutableList(String string) { 546 this.string = string; 547 } 548 549 @Override public boolean contains(@Nullable Object object) { 550 return indexOf(object) >= 0; 551 } 552 553 @Override public int indexOf(@Nullable Object object) { 554 return (object instanceof Character) 555 ? string.indexOf((Character) object) : -1; 556 } 557 558 @Override public int lastIndexOf(@Nullable Object object) { 559 return (object instanceof Character) 560 ? string.lastIndexOf((Character) object) : -1; 561 } 562 563 @Override public UnmodifiableListIterator<Character> listIterator( 564 int index) { 565 return new AbstractIndexedListIterator<Character>(size(), index) { 566 @Override protected Character get(int index) { 567 return string.charAt(index); 568 } 569 }; 570 } 571 572 @Override public ImmutableList<Character> subList( 573 int fromIndex, int toIndex) { 574 return charactersOf(string.substring(fromIndex, toIndex)); 575 } 576 577 @Override boolean isPartialView() { 578 return false; 579 } 580 581 @Override public Character get(int index) { 582 return string.charAt(index); 583 } 584 585 @Override public int size() { 586 return string.length(); 587 } 588 589 @Override public boolean equals(@Nullable Object obj) { 590 if (!(obj instanceof List)) { 591 return false; 592 } 593 List<?> list = (List<?>) obj; 594 int n = string.length(); 595 if (n != list.size()) { 596 return false; 597 } 598 Iterator<?> iterator = list.iterator(); 599 for (int i = 0; i < n; i++) { 600 Object elem = iterator.next(); 601 if (!(elem instanceof Character) 602 || ((Character) elem).charValue() != string.charAt(i)) { 603 return false; 604 } 605 } 606 return true; 607 } 608 609 int hash = 0; 610 611 @Override public int hashCode() { 612 int h = hash; 613 if (h == 0) { 614 h = 1; 615 for (int i = 0; i < string.length(); i++) { 616 h = h * 31 + string.charAt(i); 617 } 618 hash = h; 619 } 620 return h; 621 } 622 } 623 624 /** 625 * Returns a view of the specified {@code CharSequence} as a {@code 626 * List<Character>}, viewing {@code sequence} as a sequence of Unicode code 627 * units. The view does not support any modification operations, but reflects 628 * any changes to the underlying character sequence. 629 * 630 * @param sequence the character sequence to view as a {@code List} of 631 * characters 632 * @return an {@code List<Character>} view of the character sequence 633 * @since 7.0 634 */ 635 @Beta public static List<Character> charactersOf(CharSequence sequence) { 636 return new CharSequenceAsList(checkNotNull(sequence)); 637 } 638 639 private static final class CharSequenceAsList 640 extends AbstractList<Character> { 641 private final CharSequence sequence; 642 643 CharSequenceAsList(CharSequence sequence) { 644 this.sequence = sequence; 645 } 646 647 @Override public Character get(int index) { 648 return sequence.charAt(index); 649 } 650 651 @Override public boolean contains(@Nullable Object o) { 652 return indexOf(o) >= 0; 653 } 654 655 @Override public int indexOf(@Nullable Object o) { 656 if (o instanceof Character) { 657 char c = (Character) o; 658 for (int i = 0; i < sequence.length(); i++) { 659 if (sequence.charAt(i) == c) { 660 return i; 661 } 662 } 663 } 664 return -1; 665 } 666 667 @Override public int lastIndexOf(@Nullable Object o) { 668 if (o instanceof Character) { 669 char c = ((Character) o).charValue(); 670 for (int i = sequence.length() - 1; i >= 0; i--) { 671 if (sequence.charAt(i) == c) { 672 return i; 673 } 674 } 675 } 676 return -1; 677 } 678 679 @Override public int size() { 680 return sequence.length(); 681 } 682 683 @Override public List<Character> subList(int fromIndex, int toIndex) { 684 return charactersOf(sequence.subSequence(fromIndex, toIndex)); 685 } 686 687 @Override public int hashCode() { 688 int hash = 1; 689 for (int i = 0; i < sequence.length(); i++) { 690 hash = hash * 31 + sequence.charAt(i); 691 } 692 return hash; 693 } 694 695 @Override public boolean equals(@Nullable Object o) { 696 if (!(o instanceof List)) { 697 return false; 698 } 699 List<?> list = (List<?>) o; 700 int n = sequence.length(); 701 if (n != list.size()) { 702 return false; 703 } 704 Iterator<?> iterator = list.iterator(); 705 for (int i = 0; i < n; i++) { 706 Object elem = iterator.next(); 707 if (!(elem instanceof Character) 708 || ((Character) elem).charValue() != sequence.charAt(i)) { 709 return false; 710 } 711 } 712 return true; 713 } 714 } 715 716 /** 717 * Returns a reversed view of the specified list. For example, {@code 718 * Lists.reverse(Arrays.asList(1, 2, 3))} returns a list containing {@code 3, 719 * 2, 1}. The returned list is backed by this list, so changes in the returned 720 * list are reflected in this list, and vice-versa. The returned list supports 721 * all of the optional list operations supported by this list. 722 * 723 * <p>The returned list is random-access if the specified list is random 724 * access. 725 * 726 * @since 7.0 727 */ 728 public static <T> List<T> reverse(List<T> list) { 729 if (list instanceof ReverseList) { 730 return ((ReverseList<T>) list).getForwardList(); 731 } else if (list instanceof RandomAccess) { 732 return new RandomAccessReverseList<T>(list); 733 } else { 734 return new ReverseList<T>(list); 735 } 736 } 737 738 private static class ReverseList<T> extends AbstractList<T> { 739 private final List<T> forwardList; 740 741 ReverseList(List<T> forwardList) { 742 this.forwardList = checkNotNull(forwardList); 743 } 744 745 List<T> getForwardList() { 746 return forwardList; 747 } 748 749 private int reverseIndex(int index) { 750 int size = size(); 751 checkElementIndex(index, size); 752 return (size - 1) - index; 753 } 754 755 private int reversePosition(int index) { 756 int size = size(); 757 checkPositionIndex(index, size); 758 return size - index; 759 } 760 761 @Override public void add(int index, @Nullable T element) { 762 forwardList.add(reversePosition(index), element); 763 } 764 765 @Override public void clear() { 766 forwardList.clear(); 767 } 768 769 @Override public T remove(int index) { 770 return forwardList.remove(reverseIndex(index)); 771 } 772 773 @Override protected void removeRange(int fromIndex, int toIndex) { 774 subList(fromIndex, toIndex).clear(); 775 } 776 777 @Override public T set(int index, @Nullable T element) { 778 return forwardList.set(reverseIndex(index), element); 779 } 780 781 @Override public T get(int index) { 782 return forwardList.get(reverseIndex(index)); 783 } 784 785 @Override public boolean isEmpty() { 786 return forwardList.isEmpty(); 787 } 788 789 @Override public int size() { 790 return forwardList.size(); 791 } 792 793 @Override public boolean contains(@Nullable Object o) { 794 return forwardList.contains(o); 795 } 796 797 @Override public boolean containsAll(Collection<?> c) { 798 return forwardList.containsAll(c); 799 } 800 801 @Override public List<T> subList(int fromIndex, int toIndex) { 802 checkPositionIndexes(fromIndex, toIndex, size()); 803 return reverse(forwardList.subList( 804 reversePosition(toIndex), reversePosition(fromIndex))); 805 } 806 807 @Override public int indexOf(@Nullable Object o) { 808 int index = forwardList.lastIndexOf(o); 809 return (index >= 0) ? reverseIndex(index) : -1; 810 } 811 812 @Override public int lastIndexOf(@Nullable Object o) { 813 int index = forwardList.indexOf(o); 814 return (index >= 0) ? reverseIndex(index) : -1; 815 } 816 817 @Override public Iterator<T> iterator() { 818 return listIterator(); 819 } 820 821 @Override public ListIterator<T> listIterator(int index) { 822 int start = reversePosition(index); 823 final ListIterator<T> forwardIterator = forwardList.listIterator(start); 824 return new ListIterator<T>() { 825 826 boolean canRemove; 827 boolean canSet; 828 829 @Override public void add(T e) { 830 forwardIterator.add(e); 831 forwardIterator.previous(); 832 canSet = canRemove = false; 833 } 834 835 @Override public boolean hasNext() { 836 return forwardIterator.hasPrevious(); 837 } 838 839 @Override public boolean hasPrevious() { 840 return forwardIterator.hasNext(); 841 } 842 843 @Override public T next() { 844 if (!hasNext()) { 845 throw new NoSuchElementException(); 846 } 847 canSet = canRemove = true; 848 return forwardIterator.previous(); 849 } 850 851 @Override public int nextIndex() { 852 return reversePosition(forwardIterator.nextIndex()); 853 } 854 855 @Override public T previous() { 856 if (!hasPrevious()) { 857 throw new NoSuchElementException(); 858 } 859 canSet = canRemove = true; 860 return forwardIterator.next(); 861 } 862 863 @Override public int previousIndex() { 864 return nextIndex() - 1; 865 } 866 867 @Override public void remove() { 868 checkState(canRemove); 869 forwardIterator.remove(); 870 canRemove = canSet = false; 871 } 872 873 @Override public void set(T e) { 874 checkState(canSet); 875 forwardIterator.set(e); 876 } 877 }; 878 } 879 } 880 881 private static class RandomAccessReverseList<T> extends ReverseList<T> 882 implements RandomAccess { 883 RandomAccessReverseList(List<T> forwardList) { 884 super(forwardList); 885 } 886 } 887 888 /** 889 * An implementation of {@link List#hashCode()}. 890 */ 891 static int hashCodeImpl(List<?> list){ 892 int hashCode = 1; 893 for (Object o : list) { 894 hashCode = 31 * hashCode + (o == null ? 0 : o.hashCode()); 895 } 896 return hashCode; 897 } 898 899 /** 900 * An implementation of {@link List#equals(Object)}. 901 */ 902 static boolean equalsImpl(List<?> list, @Nullable Object object) { 903 if (object == checkNotNull(list)) { 904 return true; 905 } 906 if (!(object instanceof List)) { 907 return false; 908 } 909 910 List<?> o = (List<?>) object; 911 912 return list.size() == o.size() 913 && Iterators.elementsEqual(list.iterator(), o.iterator()); 914 } 915 916 /** 917 * An implementation of {@link List#addAll(int, Collection)}. 918 */ 919 static <E> boolean addAllImpl( 920 List<E> list, int index, Iterable<? extends E> elements) { 921 boolean changed = false; 922 ListIterator<E> listIterator = list.listIterator(index); 923 for (E e : elements) { 924 listIterator.add(e); 925 changed = true; 926 } 927 return changed; 928 } 929 930 /** 931 * An implementation of {@link List#indexOf(Object)}. 932 */ 933 static int indexOfImpl(List<?> list, @Nullable Object element){ 934 ListIterator<?> listIterator = list.listIterator(); 935 while (listIterator.hasNext()) { 936 if (Objects.equal(element, listIterator.next())) { 937 return listIterator.previousIndex(); 938 } 939 } 940 return -1; 941 } 942 943 /** 944 * An implementation of {@link List#lastIndexOf(Object)}. 945 */ 946 static int lastIndexOfImpl(List<?> list, @Nullable Object element){ 947 ListIterator<?> listIterator = list.listIterator(list.size()); 948 while (listIterator.hasPrevious()) { 949 if (Objects.equal(element, listIterator.previous())) { 950 return listIterator.nextIndex(); 951 } 952 } 953 return -1; 954 } 955 956 /** 957 * Returns an implementation of {@link List#listIterator(int)}. 958 */ 959 static <E> ListIterator<E> listIteratorImpl(List<E> list, int index) { 960 return new AbstractListWrapper<E>(list).listIterator(index); 961 } 962 963 /** 964 * An implementation of {@link List#subList(int, int)}. 965 */ 966 static <E> List<E> subListImpl( 967 final List<E> list, int fromIndex, int toIndex) { 968 List<E> wrapper; 969 if (list instanceof RandomAccess) { 970 wrapper = new RandomAccessListWrapper<E>(list) { 971 @Override public ListIterator<E> listIterator(int index) { 972 return backingList.listIterator(index); 973 } 974 975 private static final long serialVersionUID = 0; 976 }; 977 } else { 978 wrapper = new AbstractListWrapper<E>(list) { 979 @Override public ListIterator<E> listIterator(int index) { 980 return backingList.listIterator(index); 981 } 982 983 private static final long serialVersionUID = 0; 984 }; 985 } 986 return wrapper.subList(fromIndex, toIndex); 987 } 988 989 private static class AbstractListWrapper<E> extends AbstractList<E> { 990 final List<E> backingList; 991 992 AbstractListWrapper(List<E> backingList) { 993 this.backingList = checkNotNull(backingList); 994 } 995 996 @Override public void add(int index, E element) { 997 backingList.add(index, element); 998 } 999 1000 @Override public boolean addAll(int index, Collection<? extends E> c) { 1001 return backingList.addAll(index, c); 1002 } 1003 1004 @Override public E get(int index) { 1005 return backingList.get(index); 1006 } 1007 1008 @Override public E remove(int index) { 1009 return backingList.remove(index); 1010 } 1011 1012 @Override public E set(int index, E element) { 1013 return backingList.set(index, element); 1014 } 1015 1016 @Override public boolean contains(Object o) { 1017 return backingList.contains(o); 1018 } 1019 1020 @Override public int size() { 1021 return backingList.size(); 1022 } 1023 } 1024 1025 private static class RandomAccessListWrapper<E> 1026 extends AbstractListWrapper<E> implements RandomAccess { 1027 RandomAccessListWrapper(List<E> backingList) { 1028 super(backingList); 1029 } 1030 } 1031 } 1032