从CharSequence更改为Set <charsequence>&amp;的字符串Map <charsequence,object =“”> </charsequence,> </charsequence>

时间:2013-11-01 12:26:07

标签: java swing java-ee map set

情景1:

我从某处获得了Set<CharSequence> ,这意味着我无法控制如何创建此集

Set<CharSequence> dataSet = GET_DATA_SET();

我想将数据从Set<CharSequence>转换为Set<String>。有没有一种有效的方法来进行这种转换而不对每个元素进行迭代?

情景2:

我还得到另一个数据HashMap类型(同样,我无法控制此地图数据的创建部分):

Map<CharSequence, Car> dataMap = GET_DATA_MAP();

是否有一种有效的方法可以将此地图转换为Map<String, Car>而无需迭代?

6 个答案:

答案 0 :(得分:1)

提及 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());
    }

非常简单明了

答案 1 :(得分:1)

如果你确定该对象是String s,那么你可以进行(未经检查)演员表,如果你假设出错了,你将获得ClassCastException

Map<CharSequence, Object> dataMap = new HashMap<>();
@SuppressWarnings("rawtypes")
Map untypedDataMap = dataMap;
@SuppressWarnings("unchecked")
Map<String, Object> stringDataMap = untypedDataMap;

请注意,这是非常危险的,特别是如果Map来自外部库。我会遍历Map以将每个CharSequence转换为String

你的问题是基于假设循环效率低下,但你确定吗?在你的情况下,它会是一个什么问题?现代编译器和硬件非常有效,甚至可能没有注意到循环的差异。

答案 2 :(得分:0)

如果您确定没有非字符串对象,只需使用

将对象转换为Set<String>
(Set<String>)((Object)dataSet);

示例:

(Set<String>)((Object)new HashSet<CharSequence>()));

但这是非常脏和不安全的技巧。

编辑: 正如@LaurentG所提到的,你可以做到

(Set<String>)((Set)dataSet);

答案 3 :(得分:0)

尝试

 Set<String> dataSet = (Set<String>)(Set)GET_DATA_SET();

答案 4 :(得分:0)

您可以使用此通配符:

Set<? extends CharSequence> dataSet;
Map<? extends CharSequence, Car> dataMap;

这是安全的。但是你必须记住你的方法可能会返回对象,你将无法将其转换为CharSequence的一些继承人

答案 5 :(得分:0)

不确定在java核心中是否可以不进行迭代。也许,你可以使用番石榴来做到这一点。请查看Lists.transformCollections2.transform