私はイテレータを使用してのheadMapとのtailMapを使用するよりも優れていると思い、それは効率的ではないので、私は次のようにテストしました例のコードと、それは良い作品とfloorEntry2がfloorEntry1より3倍高速である。
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import java.util.*;
import java.util.Map.Entry;
import org.junit.Before;
import org.junit.Test;
class TestMapUtils <K,V> {
public TestMapUtils()
{
}
public Map.Entry<K, V> floorEntry1(final SortedMap<K, V> m, K key) {
final SortedMap<K, V> tail;
if (m.containsKey(key)) {
tail = m.tailMap(key);
} else {
SortedMap<K, V> head = m.headMap(key);
if (head.isEmpty()) {
return null;
} else {
tail = head.tailMap(head.lastKey());
}
}
return tail.entrySet()
.iterator()
.next();
}
public Map.Entry<K, V> floorEntry2(final NavigableMap<K, V> m, K key) {
Iterator<Map.Entry<K,V>> i = m.entrySet().iterator();
Entry<K,V> tailEntry = null;
if (key==null) {
while (i.hasNext()) {
Entry<K,V> e = i.next();
if (e.getKey()==null)
return null;
}
} else {
while (i.hasNext()) {
Entry<K,V> e = i.next();
if (key.equals(e.getKey()))
{
return e;
}
else
{
if (((Integer) e.getKey()).intValue() < (((Integer) key).intValue())) {
tailEntry = e;
}
}
}
}
return tailEntry;
}
}
public class TestSortedMap {
protected TestMapUtils<Integer, Integer> testMapUtils;
private NavigableMap<Integer, Integer> sortedMap;
@Before
public void setUp()
{
testMapUtils = new TestMapUtils<Integer, Integer>();
sortedMap = addElementsToMap();
}
private NavigableMap<Integer, Integer> addElementsToMap() {
NavigableMap<Integer, Integer> map = new TreeMap<Integer, Integer>();
map.put(10, 1);
map.put(20, 2);
map.put(30, 3);
map.put(40, 4);
map.put(50, 5);
map.put(60, 6);
return map;
}
@Test
public void testFloorEntry()
{
long startTime1 = System.nanoTime();
Entry<Integer, Integer> entry = testMapUtils.floorEntry2(sortedMap, 30);
assertNotNull(entry);
assertEquals(entry.getKey().intValue(), 30);
entry = testMapUtils.floorEntry2(sortedMap, 60);
assertNotNull(entry);
assertEquals(entry.getKey().intValue(), 60);
entry = testMapUtils.floorEntry2(sortedMap, 70);
assertNotNull(entry);
assertEquals(entry.getKey().intValue(), 60);
entry = testMapUtils.floorEntry2(sortedMap, 55);
assertNotNull(entry);
assertEquals(entry.getKey().intValue(), 50);
entry = testMapUtils.floorEntry2(sortedMap, 31);
assertNotNull(entry);
assertEquals(entry.getKey().intValue(), 30);
entry = testMapUtils.floorEntry2(sortedMap, 0);
assertNull(entry);
long endTime1 = System.nanoTime() - startTime1;
long startTime2 = System.nanoTime();
entry = testMapUtils.floorEntry1(sortedMap, 30);
assertNotNull(entry);
assertEquals(entry.getKey().intValue(), 30);
entry = testMapUtils.floorEntry1(sortedMap, 60);
assertNotNull(entry);
assertEquals(entry.getKey().intValue(), 60);
entry = testMapUtils.floorEntry1(sortedMap, 70);
assertNotNull(entry);
assertEquals(entry.getKey().intValue(), 60);
entry = testMapUtils.floorEntry1(sortedMap, 55);
assertNotNull(entry);
assertEquals(entry.getKey().intValue(), 50);
entry = testMapUtils.floorEntry1(sortedMap, 31);
assertNotNull(entry);
assertEquals(entry.getKey().intValue(), 30);
entry = testMapUtils.floorEntry1(sortedMap, 0);
assertNull(entry);
long endTime2 = System.nanoTime() - startTime2;
if (endTime2 > endTime1)
{
System.out.println("First Execution is faster.. "+endTime1+", "+endTime2);
} else if (endTime1 > endTime2) {
System.out.println("Second Execution is faster.. "+endTime1+", "+endTime2);
} else {
System.out.println("Execution times are same");
}
}
}
[Josh Blochによる](https://www.youtube.com/watch?v=aAb7hSCtvGw#t=1258)、両方のインタフェースの作成者には、Java 6で修正されたSortedMapの欠陥があります。 NavigableMapを導入する。 –