Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从集合/映射获取参数化数组_Java_Arrays_Generics_Reflection - Fatal编程技术网

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),我没有看到一个方法可以做到这一点