场景1:
我从somewhere获得了一个,这意味着无法控制这个集合是如何创建的。
Set<CharSequence> dataSet = GET_DATA_SET();我想将数据从Set<CharSequence>转换为Set<String>。是否有一种有效的方法来完成此转换而不对每个元素进行迭代?
场景2:
我还获得了另一个HashMap类型的数据(同样,我无法控制这个Map数据的创建部分):
Map<CharSequence, Car> dataMap = GET_DATA_MAP();有没有一种有效的方法可以不用迭代就将这个映射转换成Map<String, Car>?
发布于 2013-11-01 12:31:58
正如提到的Eng.Fouad一样,并不是所有的CharSequence都是String。
因此我们必须调用toString()方法。
只需使用:
Set<CharSequence> dataSet = new HashSet<CharSequence>(Arrays.asList("a","b"));
Set<String> output = new HashSet<String>();
for(CharSequence c : dataSet){
output.add(c.toString());
}很简单很清楚
发布于 2013-11-01 12:34:31
如果您确信该对象是String的,那么您可以执行(未检查的)强制转换,如果您的假设变得错误,您将得到一个ClassCastException。
Map<CharSequence, Object> dataMap = new HashMap<>();
@SuppressWarnings("rawtypes")
Map untypedDataMap = dataMap;
@SuppressWarnings("unchecked")
Map<String, Object> stringDataMap = untypedDataMap;请注意,这是相当危险的,特别是如果Map来自外部库。我会循环遍历Map,将每个CharSequence转换为一个String。
您的问题是基于循环效率低下的假设,但您确定这一点吗?在你的案子里怎么会有问题呢?现代的编译器和硬件是非常高效的,很可能你甚至没有注意到一个循环的区别。
发布于 2013-11-01 12:32:56
如果确定没有非字符串对象,只需使用以下方法将对象转换为Set<String>
(Set<String>)((Object)dataSet);示例:
(Set<String>)((Object)new HashSet<CharSequence>()));但这是非常肮脏和不安全的伎俩。
编辑:正如@LaurentG所提到的,您可以
(Set<String>)((Set)dataSet);https://stackoverflow.com/questions/19726737
复制相似问题