我需要将元素放在一个map中,我选择了TreeMap实现,这些键在映射中按升序排列,但是其中一个“未分配”的键应该始终是第一个。这有可能吗?我的当前代码只将元素按排序顺序排列?
public class TreeMapTest {
public static void main(String args[]){
//the treemap sorts by key
Map<String, String> hm = new TreeMap<String, String>(new StringComparator());
//add key-value pair to TreeMap
hm.put("carrot","12");
hm.put("apple", "34");
hm.put("domboi","912");
hm.put("unassigned","?");
hm.put("banana", "45");
hm.put("zucchini","87");
System.out.println("TreeMap Entries:");
System.out.println(hm);
}
}
class StringComparator implements Comparator<String>{
@Override
public int compare(String str1, String str2) {
return str1.compareTo(str2);
}
}
当前输出是
{apple=34, banana=45, carrot=12, domboi=912, unassigned=?, zucchini=87}
我想要输出
{unassigned=?,apple=34, banana=45, carrot=12, domboi=912,zucchini=87}
发布于 2016-05-26 16:19:21
只需为此更改您的Comparator
:
class StringComparator implements Comparator<String> {
@Override
public int compare(String str1, String str2) {
if (str1.equals(str2)) {
return 0;
} else if ("unassigned".equals(str1)) {
return -1;
} else if ("unassigned".equals(str2)) {
return 1;
}
return str1.compareTo(str2);
}
}
输出:
TreeMap Entries:
{unassigned=?, apple=34, banana=45, carrot=12, domboi=912, zucchini=87}
发布于 2016-05-26 18:58:05
实际上,你可以在某个位置注入一个元素。因此,例如,特殊条目可以在迭代中第三次出现。
只是为了好玩,我想到了下面的可憎之处。我没有修改订单,而是将一个TreeMap
与一个额外的伪条目包装在一起。对于它将如何在迭代期间处理条目删除,我并不太自信,但希望您能够理解。
我应该指出,这个映射总是有一个“未赋值”条目,默认值为null
。如果您不想这样做,可以使用类似的方法,但是当添加“未分配”键时,可以等待将entries
成员从TreeSet
切换到SillySet
。或者类似的东西。
import java.util.AbstractMap;
import java.util.AbstractSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.TreeMap;
final class SillyMap<K, V>
extends AbstractMap<K, V>
{
private final SillySet entries;
SillyMap(K key, int unassigned)
{
entries = new SillySet(key, unassigned);
}
@Override
public Set<Map.Entry<K, V>> entrySet()
{
return entries;
}
@Override
public V put(K key, V value)
{
if (entries.extra.getKey().equals(key))
return entries.extra.setValue(value);
else
return entries.map.put(key, value);
}
private final class SillySet
extends AbstractSet<Map.Entry<K, V>>
{
final Map<K, V> map = new TreeMap<>();
final Map.Entry<K, V> extra;
private final int unassigned;
SillySet(K key, int unassigned)
{
extra = new SimpleEntry<>(Objects.requireNonNull(key), null);
if (unassigned < 0)
throw new IllegalArgumentException();
this.unassigned = unassigned;
}
@Override
public Iterator<Map.Entry<K, V>> iterator()
{
return new Iterator<Map.Entry<K, V>>()
{
private final Iterator<Map.Entry<K, V>> i = map.entrySet().iterator();
private int index = 0;
@Override
public boolean hasNext()
{
return index < size();
}
@Override
public Map.Entry<K, V> next()
{
Map.Entry<K, V> e;
if (index == Math.min(unassigned, map.size()))
e = extra;
else
e = i.next();
++index;
return e;
}
@Override
public void remove()
{
if (index - 1 == unassigned)
throw new UnsupportedOperationException();
i.remove();
--index;
}
};
}
@Override
public int size()
{
return map.size() + 1;
}
};
public static void main(String... argv)
{
final String KEY = "unassigned";
Map<String, String> hm = new SillyMap<>(KEY, 3);
hm.put("carrot", "12");
hm.put("apple", "34");
hm.put("domboi", "912");
hm.put(KEY, "?");
hm.put("banana", "45");
hm.put("zucchini", "87");
System.out.println(hm);
}
}
https://stackoverflow.com/questions/37466148
复制相似问题