| 1 20 package net.sf.clirr.core.internal; 21 22 import java.util.Collection ; 23 import java.util.Comparator ; 24 import java.util.Arrays ; 25 import java.util.NoSuchElementException ; 26 27 51 52 public final class CoIterator 53 { 54 private Object [] left; 55 private Object [] right; 56 57 private int leftIndex; 58 private int rightIndex; 59 60 private Object currLeft; 61 private Object currRight; 62 63 private Comparator comparator; 64 65 74 public CoIterator(Comparator comparator, Collection left, Collection right) 75 { 76 this.comparator = comparator; 77 this.left = left.toArray(); 78 this.right = right.toArray(); 79 80 Arrays.sort(this.left, comparator); 81 Arrays.sort(this.right, comparator); 82 } 83 84 95 public CoIterator(Comparator comparator, Object [] left, Object [] right) 96 { 97 this.comparator = comparator; 98 this.left = (Object []) left.clone(); 99 this.right = (Object []) right.clone(); 100 101 Arrays.sort(this.left, comparator); 102 Arrays.sort(this.right, comparator); 103 } 104 105 108 public boolean hasNext() 109 { 110 return (leftIndex < left.length) || (rightIndex < right.length); 111 } 112 113 123 public void next() 124 { 125 boolean haveLeft = leftIndex < left.length; 126 boolean haveRight = rightIndex < right.length; 127 128 if (!haveLeft && !haveRight) 129 { 130 currLeft = null; 131 currRight = null; 132 throw new NoSuchElementException (); 133 } 134 135 int order; 136 137 if (haveLeft && !haveRight) 138 { 139 order = -1; 140 } 141 else if (!haveLeft && haveRight) 142 { 143 order = +1; 144 } 145 else if (comparator != null) 146 { 147 order = comparator.compare(left[leftIndex], right[rightIndex]); 148 } 149 else 150 { 151 Comparable c1 = (Comparable ) left[leftIndex]; 152 order = c1.compareTo(right[rightIndex]); 153 } 154 155 if (order < 0) 156 { 157 currLeft = left[leftIndex]; 158 currRight = null; 159 ++leftIndex; 160 } 161 else if (order > 0) 162 { 163 currLeft = null; 164 currRight = right[rightIndex]; 165 ++rightIndex; 166 } 167 else 168 { 169 currLeft = left[leftIndex]; 170 currRight = right[rightIndex]; 171 ++leftIndex; 172 ++rightIndex; 173 } 174 } 175 176 182 public Object getLeft() 183 { 184 return currLeft; 185 } 186 187 190 public Object getRight() 191 { 192 return currRight; 193 } 194 } 195 | Popular Tags |