/*
* Mojito Distributed Hash Table (Mojito DHT)
* Copyright (C) 2006-2007 LimeWire LLC
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
package org.limewire.mojito.util;
import java.util.AbstractCollection;
import java.util.Collection;
import java.util.Iterator;
import java.util.NoSuchElementException;
import org.limewire.mojito.settings.KademliaSettings;
/**
* Miscellaneous utilities for Collections.
*/
public final class CollectionUtils {
private CollectionUtils() {}
/**
* Returns the given Collection as formatted String
*/
public static String toString(Collection<?> c) {
StringBuilder buffer = new StringBuilder();
Iterator it = c.iterator();
for(int i = 0; it.hasNext(); i++) {
buffer.append(i).append(": ").append(it.next()).append('\n');
}
// Delete the last \n
if(buffer.length() > 1) {
buffer.setLength(buffer.length()-1);
}
return buffer.toString();
}
/**
* Returns an iterator that returns up to max number of elements from the
* Collection
*/
private static <T> Iterator<T> iterator(final Collection<T> c, final int count) {
return new Iterator<T>() {
private final Iterator<T> it = c.iterator();
private int item = 0;
public boolean hasNext() {
if (item >= count) {
return false;
}
return it.hasNext();
}
public T next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
item++;
return it.next();
}
public void remove() {
it.remove();
item--;
}
};
}
/**
* Returns a sub-view of the given Collection that will only return
* the first K elements
*/
public static <T> Collection<T> getCollection(Collection<T> c) {
return getCollection(c, KademliaSettings.REPLICATION_PARAMETER.getValue());
}
/**
* Returns a sub-view of the given Collection that will only return
* the first count elements
*/
public static <T> Collection<T> getCollection(final Collection<T> c, final int count) {
return new AbstractCollection<T>() {
@Override
public Iterator<T> iterator() {
return CollectionUtils.iterator(c, count);
}
@Override
public int size() {
return Math.min(c.size(), count);
}
};
}
}