/*
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.cooliris.media;
import java.util.ArrayList;
import java.util.Arrays;
public final class ArrayUtils {
public static final void computeSortedIntersection(ArrayList<MediaItem> firstList, final ArrayList<MediaItem> secondList,
int maxSize, ArrayList<MediaItem> intersectionList, MediaItem[] hash) {
// Assumes that firstList is generally larger than the second list.
// Build a simple filter to speed up containment testing.
int mask = hash.length - 1;
int numItemsToHash = Math.min(secondList.size(), 2 * hash.length);
for (int i = 0; i < numItemsToHash; ++i) {
MediaItem item = secondList.get(i);
if (item != null) {
hash[item.hashCode() & mask] = item;
}
}
// Build the intersection array.
int firstListSize = firstList.size();
for (int i = 0; i < firstListSize; ++i) {
MediaItem firstListItem = firstList.get(i);
if (firstListItem == null)
continue;
MediaItem hashItem = (hash != null) ? hash[firstListItem.hashCode() & mask] : null;
if (hashItem != null
&& ((hashItem.mId != Shared.INVALID && hashItem.hashCode() == firstListItem.hashCode()) || contains(secondList, firstListItem))) {
intersectionList.add(firstListItem);
if (--maxSize == 0) {
break;
}
}
}
// Clear the hash table.
Arrays.fill(hash, null);
}
public static final boolean contains(Object[] array, Object object) {
if (object == null) {
return false;
}
int length = array.length;
for (int i = 0; i < length; ++i) {
if (object.equals(array[i])) {
return true;
}
}
return false;
}
public static void clear(Object[] array) {
int length = array.length;
for (int i = 0; i < length; i++) {
array[i] = null;
}
}
public static final boolean contains(ArrayList<MediaItem> items, MediaItem item) {
final int numItems = items.size();
if (item.mId == Shared.INVALID)
return false;
for (int i = 0; i < numItems; ++i) {
MediaItem thisItem = items.get(i);
if (item.hashCode() == thisItem.hashCode())
return true;
}
return false;
}
public static final String[] addAll(final String[] first, final String[] second) {
if (first == null && second == null)
return null;
if (first == null)
return second;
if (second == null)
return first;
final int numFirst = first.length;
final int numSecond = second.length;
String[] newArray = new String[numFirst + numSecond];
for (int i = 0; i < numFirst; ++i) {
newArray[i] = first[i];
}
for (int i = 0; i < numSecond; ++i) {
newArray[numFirst + i] = second[i];
}
return newArray;
}
}