Java数据结构
我需要一些数据结构,我可以建立从标准集合或使用番石榴。所以它应该是可变的Java数据结构,java,collections,map,guava,Java,Collections,Map,Guava,我需要一些数据结构,我可以建立从标准集合或使用番石榴。所以它应该是可变的Map。其中V是非常有趣的结构 V要求: 易变的 按比较器排序(允许元素如compare(a,b)==0)——这是迭代的需要 设置(不存在a和b,即a.equals(b)=true)-可选 映射的额外可选要求 键应该按其自然顺序进行迭代 现在是HashMap,代码中有不同的内容,如collections.sort() 谢谢。您需要一个集合实现V,它是这样使用的:HashMap。上述要求影响V(非实体)。对吧? 我认为
Map
。其中V
是非常有趣的结构
V
要求:
- 易变的
- 按比较器排序(允许元素如compare(a,b)==0)——这是迭代的需要
- 设置(不存在
和a
,即b
)-可选a.equals(b)=true
- 键应该按其自然顺序进行迭代
HashMap
,代码中有不同的内容,如collections.sort()
谢谢。您需要一个集合实现V,它是这样使用的:HashMap。上述要求影响V(非实体)。对吧? 我认为a应该满足你的要求:
- TreeSet实现Set接口
- 按自然顺序或自定义比较器排序
- 可以添加和删除元素
HashMap
<代码>枚举映射s对于枚举键更有效。在番石榴中检查[]。一个示例实现
以下是所需类的实现:
第一个缺点是:它必须驻留在包com.google.common.collect
中。番石榴的制造商们以他们无限的智慧制作了AbstractSortedSetMultimap
包装范围
我将在所有示例中使用此enum
:
public enum Color{
RED, BLUE, GREEN
};
构建课堂
共有六名施工人员:
- 空(对值使用
和自然排序)HashMap
- 使用
(如果要对键进行排序,请使用此选项,传入Map
实现)SortedMap
- 使用
和类
(与上面相同,但使用自定义比较器对值进行排序)比较器
如果一个额外的类太多,您可能希望使用该类的工厂方法
是的。我首先用它实现了它),但是TreeSet不能包含SortedSetMultimap集=Multimaps.newSortedSetMultimap( 新建HashMap(), 新供应商(){ @凌驾 公共树集get(){ 返回新树集(新比较器(){ @凌驾 公共整数比较(实体o1、实体o2){ //待办事项实施 } }); } });
这样的元素。非常感谢。也许,我会用它。在回答这个问题之后,如果Kewin改变AbstractSortedSetMultimap的范围,那就太完美了)我想他们最终会的。我的猜测是,他们还没有致力于API,所以他们只公开实现类。@S.P.Floyd-seanizer,我希望是这样。@Stas:如果他们不改变范围,你可以在你的项目中创建一个名为“com.google.common.collect”的包并添加类。我尝试过,它对我有效。@S.P.Floyd-seanizer,你做了一件大事。谢谢你)compare(a,b)==0
是个好主意(+1),但问题是它不允许空构造函数。enum类是必需的。非常好的总结。EnumMap
SortedSetMultimap<Color,String> simple = new EnumValueSortMultiMap<Color, String>();
SortedSetMultimap<Color,String> inreverse = new EnumValueSortMultiMap<Color, String>( Ordering.natural().reverse() );
SortedSetMultimap<Color,String> withSortedKeys = new EnumValueSortMultiMap<Color, String>( new TreeMap<Color, Collection<String>>() );
SortedSetMultimap<Color,String> reverseWithSortedKeys = new EnumValueSortMultiMap<Color, String>( new TreeMap<Color, Collection<String>>(), Ordering.natural().reverse() );
SortedSetMultimap<Color,String> withEnumMap = new EnumValueSortMultiMap<Color, String>( Color.class );
SortedSetMultimap<Color,String> reverseWithEnumMap = new EnumValueSortMultiMap<Color, String>( Color.class, Ordering.natural().reverse() );
package com.google.common.collect; import java.util.Collection; import java.util.Comparator; import java.util.EnumMap; import java.util.HashMap; import java.util.Map; import java.util.SortedSet; import java.util.TreeSet; public class EnumValueSortMultiMap<K extends Enum<K>, V extends Comparable<? super V>> extends AbstractSortedSetMultimap<K, V>{ private static final long serialVersionUID = 5359491222446743952L; private Comparator<? super V> comparator; private Class<K> enumType; public EnumValueSortMultiMap(){ this(new HashMap<K, Collection<V>>()); } public EnumValueSortMultiMap(final Comparator<? super V> comparator){ this(new HashMap<K, Collection<V>>(), comparator); } public EnumValueSortMultiMap(final Map<K, Collection<V>> map){ this(map, Ordering.natural()); } public EnumValueSortMultiMap(final Map<K, Collection<V>> map, final Comparator<? super V> comparator){ super(map); this.comparator = comparator; } public EnumValueSortMultiMap(final Class<K> enumClass, final Comparator<? super V> comparator){ this(new EnumMap<K, Collection<V>>(enumClass), comparator); } public EnumValueSortMultiMap(final Class<K> enumClass){ this(new EnumMap<K, Collection<V>>(enumClass)); } @Override Map<K, Collection<V>> backingMap(){ return new EnumMap<K, Collection<V>>(enumType); } @Override public Comparator<? super V> valueComparator(){ return comparator; } @Override SortedSet<V> createCollection(){ return new TreeSet<V>(comparator); } }
public static <E extends Enum<E>, V> Multimap<E, V> getMap( final Class<E> clz){ return Multimaps.newListMultimap( Maps.<E, Collection<V>> newEnumMap(clz), new Supplier<List<V>>(){ @Override public List<V> get(){ return new SortedArrayList<V>(); } } ); }
SortedSetMultimap<Color, Entity> set = Multimaps.newSortedSetMultimap( new HashMap<Enum, Collection<Entity>>(), new Supplier<TreeSet<Entity>>() { @Override public TreeSet<Entity> get() { return new TreeSet<Entity>(new Comparator<Entity>() { @Override public int compare(Entity o1, Entity o2) { //TODO implement } }); } });