Задача: "The Java Programming Language" Ken Arnold, James Gosling, David Holmes листинги, код, примеры из книги, исходники
Исходник: Глава 16, Коллекции (Chapter 16. Collections), ArrayBunchList, язык: java [code #169, hits: 9776]
автор: - [добавлен: 11.09.2006]
  1. import java.util.*;
  2.  
  3. /**
  4. * Created by IntelliJ IDEA.
  5. * User: me
  6. * Date: 11.09.2006
  7. * Time: 15:38:21
  8. * To change this template use File | Settings | File Templates.
  9. */
  10. public class ArrayBunchList extends AbstractList {
  11. private Object[][] arrays;
  12. private int size;
  13.  
  14. // **************************** INNER >>
  15. private class ABLIterator implements Iterator {
  16. private int off;
  17. private int array;
  18. private int pos;
  19.  
  20. public ABLIterator() {
  21. off = 0;
  22. pos = 0;
  23. // Miss all empty arrays
  24. for (array = 0; array < arrays.length; array++)
  25. if (arrays[array].length > 0)
  26. break;
  27. }
  28.  
  29. public boolean hasNext() {
  30. return off + pos < size();
  31. }
  32.  
  33. public Object next() {
  34. if (!hasNext())
  35.  
  36. Object ret = arrays[array][pos++];
  37. while (pos >= arrays[array].length) {
  38. off += arrays[array++].length;
  39. pos = 0;
  40. if (array >= arrays.length)
  41. break;
  42. }
  43. return ret;
  44. }
  45.  
  46. public void remove() {
  47. }
  48. }
  49. // **************************** << INNER
  50.  
  51. public ArrayBunchList(Object[][] arrays) {
  52. this.arrays = (Object[][])arrays.clone();
  53. int s = 0;
  54. for (int i = 0; i < arrays.length; i++) {
  55. s += arrays[i].length;
  56. }
  57. size = s;
  58. }
  59.  
  60.  
  61. public int size() {
  62. return size;
  63. }
  64.  
  65. public Object get(int index) {
  66. int off = 0;
  67. for (int i = 0; i < arrays.length; i++) {
  68. if (index < off + arrays[i].length)
  69. return arrays[i][index - off];
  70. off += arrays[i].length;
  71. }
  72. }
  73.  
  74. public Object set(int index, Object value) {
  75. int off = 0;
  76. for (int i = 0; i < arrays.length; i++) {
  77. if (index < off + arrays[i].length) {
  78. Object ret = arrays[i][index - off];
  79. arrays[i][index - off] = value;
  80. return ret;
  81. }
  82. off += arrays[i].length;
  83. }
  84. }
  85.  
  86. public Iterator iterator() {
  87. return new ABLIterator();
  88. }
  89. }
  90.  
  91.  
  92.  
Данный класс создает список, состоящий из нескольких массивов. Данного результата можно было бы и добиться просто создавая коллекцию-список на основе всех этих массивов - но будет иметь место копирования каждого отдельного массива в эту коллекцию, что при больших их размерах отразиться на производительности.
Этот же класс работает со всеми этими массивами, как с единым список, оставляя их в первоначальном виде.

Обратите внимание на то как реализован метод next() встроенного итератора ABLIterator: автору удалось так красиво и компактно его релизовать, что к тому же он еще и учитывает пропуск пустых массивов. Поэтому-то там и стоит цикл while, а не просто условие if.
Тестировалось на: java 1.5.0_04

+добавить реализацию