Java 从集合/映射获取参数化数组
我用于将重复对象的列表/数组存储为映射,其中键是对象本身,值是其多重性 说Java 从集合/映射获取参数化数组,java,arrays,generics,reflection,Java,Arrays,Generics,Reflection,我用于将重复对象的列表/数组存储为映射,其中键是对象本身,值是其多重性 说['d','a','d','d','y']-->{d=3,a=1,y=1}(顺序保留,FWIW) 我这样做既是为了节省字节,也是因为操作这个计数映射使我的生活更轻松 有时我确实需要恢复到列表/数组形式 说{d=3,a=1,y=1}-->['d','d','a','y'] 显然,原始的顺序不能被重建,信息丢失了,但是这是不相关的,因为我考虑等价的两个列表/数组。 如果它们具有相同的大小并共享完全相同的元素(包括相对的多重性)
['d','a','d','d','y']
-->{d=3,a=1,y=1}(顺序保留,FWIW)
我这样做既是为了节省字节,也是因为操作这个计数映射使我的生活更轻松
有时我确实需要恢复到列表/数组形式
说{d=3,a=1,y=1}
-->['d','d','a','y']
显然,原始的顺序不能被重建,信息丢失了,但是这是不相关的,因为我考虑等价的两个列表/数组。
如果它们具有相同的大小并共享完全相同的元素(包括相对的多重性)
为了从映射到列表,我编写了以下方法:
<T> ArrayList<T> counted2Lst(final LinkedHashMap<T, Integer> map){
final ArrayList<T> grp=new ArrayList<T>(map.size()); // larger most of the times
for (final Entry<T, Integer> entry : map.entrySet()) {
final T obj=entry.getKey();
for(int i=entry.getValue(); i>0; i--){
grp.add(obj);
}
}
return grp;
}
您可以获得条目集的大小
if (map.entrySet().size() == 0) { /* do things */ }
您可以获得条目集的大小
if (map.entrySet().size() == 0) { /* do things */ }
您可以获得条目集的大小
if (map.entrySet().size() == 0) { /* do things */ }
您可以获得条目集的大小
if (map.entrySet().size() == 0) { /* do things */ }
你真的应该去看看番石榴。它基本上与您在代码和其他方面所做的完全相同,但是在经过生产验证的库中 下面是一个例子:
char[] chars = new char[]{'d', 'a', 'd', 'd', 'y'};
// unsorted version
ImmutableMultiset.Builder<Character> builder =
ImmutableMultiset.builder();
for (char c : chars) builder.add(c);
ImmutableMultiset<Character> mset = builder.build();
System.out.println(new ArrayList<>(mset));
// sorted version
ImmutableSortedMultiset.Builder<Character> sortedBuilder =
ImmutableSortedMultiset.naturalOrder();
for (char c : chars) sortedBuilder.add(c);
ImmutableSortedMultiset<Character> sortedMset = sortedBuilder.build();
System.out.println(new ArrayList<>(sortedMset));
// how to get an array
Object[] array = mset.toArray();
System.out.println(Arrays.toString(array));
编辑2:在上面添加了番石榴代码示例。我意识到,除非map至少有一个键,或者您传入一个(可能是空的)T[]
并使用上述整个JDK中使用的方法,或者至少让类可用(请参阅):
public T[]toArray(类类型){
int size=//定义返回数组的大小
T[]ret=(T[])数组。newInstance(类型,大小)
//填充数组
返回ret;
}
你真的应该去看看番石榴(或)。它基本上与您在代码和其他方面所做的完全相同,但是在经过生产验证的库中
下面是一个例子:
char[] chars = new char[]{'d', 'a', 'd', 'd', 'y'};
// unsorted version
ImmutableMultiset.Builder<Character> builder =
ImmutableMultiset.builder();
for (char c : chars) builder.add(c);
ImmutableMultiset<Character> mset = builder.build();
System.out.println(new ArrayList<>(mset));
// sorted version
ImmutableSortedMultiset.Builder<Character> sortedBuilder =
ImmutableSortedMultiset.naturalOrder();
for (char c : chars) sortedBuilder.add(c);
ImmutableSortedMultiset<Character> sortedMset = sortedBuilder.build();
System.out.println(new ArrayList<>(sortedMset));
// how to get an array
Object[] array = mset.toArray();
System.out.println(Arrays.toString(array));
编辑2:在上面添加了番石榴代码示例。我意识到,除非map至少有一个键,或者您传入一个(可能是空的)T[]
并使用上述整个JDK中使用的方法,或者至少让类可用(请参阅):
public T[]toArray(类类型){
int size=//定义返回数组的大小
T[]ret=(T[])数组。newInstance(类型,大小)
//填充数组
返回ret;
}
你真的应该去看看番石榴(或)。它基本上与您在代码和其他方面所做的完全相同,但是在经过生产验证的库中
下面是一个例子:
char[] chars = new char[]{'d', 'a', 'd', 'd', 'y'};
// unsorted version
ImmutableMultiset.Builder<Character> builder =
ImmutableMultiset.builder();
for (char c : chars) builder.add(c);
ImmutableMultiset<Character> mset = builder.build();
System.out.println(new ArrayList<>(mset));
// sorted version
ImmutableSortedMultiset.Builder<Character> sortedBuilder =
ImmutableSortedMultiset.naturalOrder();
for (char c : chars) sortedBuilder.add(c);
ImmutableSortedMultiset<Character> sortedMset = sortedBuilder.build();
System.out.println(new ArrayList<>(sortedMset));
// how to get an array
Object[] array = mset.toArray();
System.out.println(Arrays.toString(array));
编辑2:在上面添加了番石榴代码示例。我意识到,除非map至少有一个键,或者您传入一个(可能是空的)T[]
并使用上述整个JDK中使用的方法,或者至少让类可用(请参阅):
public T[]toArray(类类型){
int size=//定义返回数组的大小
T[]ret=(T[])数组。newInstance(类型,大小)
//填充数组
返回ret;
}
你真的应该去看看番石榴(或)。它基本上与您在代码和其他方面所做的完全相同,但是在经过生产验证的库中
下面是一个例子:
char[] chars = new char[]{'d', 'a', 'd', 'd', 'y'};
// unsorted version
ImmutableMultiset.Builder<Character> builder =
ImmutableMultiset.builder();
for (char c : chars) builder.add(c);
ImmutableMultiset<Character> mset = builder.build();
System.out.println(new ArrayList<>(mset));
// sorted version
ImmutableSortedMultiset.Builder<Character> sortedBuilder =
ImmutableSortedMultiset.naturalOrder();
for (char c : chars) sortedBuilder.add(c);
ImmutableSortedMultiset<Character> sortedMset = sortedBuilder.build();
System.out.println(new ArrayList<>(sortedMset));
// how to get an array
Object[] array = mset.toArray();
System.out.println(Arrays.toString(array));
编辑2:在上面添加了番石榴代码示例。我意识到,除非map至少有一个键,或者您传入一个(可能是空的)T[]
并使用上述整个JDK中使用的方法,或者至少让类可用(请参阅):
public T[]toArray(类类型){
int size=//定义返回数组的大小
T[]ret=(T[])数组。newInstance(类型,大小)
//填充数组
返回ret;
}
(要完成这一特定任务,您只需编写新的ArrayList(multiset)
)不确定toArray(T[])提供的代码示例是否有帮助:数组T[]的类信息确实保留了有关其参数化类型的信息,而这在Map和ArrayList中不会发生。关于Guava的MultiSet(特别是HashMultiset),我没有看到一个方法能满足我的要求。确实有java.util.AbstractCollection.toArray()-->Object[]和java.util.AbstractCollection.toArray(T[]a-->T[],但这并不是我需要的方式:一个方法返回一个E[],但是w/o传递关于参数化类型的任何信息。我认为JDK中使用的方法是唯一可能的方法。这就是为什么收藏库甚至不尝试做你想做的事情。有关如何使用Multiset
和SortedMultiset
的示例,请参见我的更新答案(要执行此特定操作,您只需编写new ArrayList(Multiset)
)不确定toArray(T[])提供的代码示例是否有帮助:数组T[]的类信息保留了有关其参数化类型的信息,然而,用Map和ArrayList,这不会发生。关于Guava的MultiSet(特别是HashMultiset),我没有看到一个方法能满足我的要求。确实有java.util.AbstractCollection.toArray()-->Object[]和java.util.AbstractCollection.toArray(T[]a-->T[],但这并不是我需要的方式:一个方法返回一个E[],但是w/o传递关于参数化类型的任何信息。我认为JDK中使用的方法是唯一可能的方法。这就是为什么收藏库甚至不尝试做你想做的事情。有关如何使用Multiset
和SortedMultiset
的示例,请参见我的更新答案(要执行此特定操作,您只需编写new ArrayList(Multiset)
)不确定toArray(T[])提供的代码示例是否有帮助:数组T[]的类信息保留了有关其参数化类型的信息,然而,用Map和ArrayList,这不会发生。关于番石榴的MultiSet(特别是HashMultiset),我没有看到一个方法可以做到这一点