1

场景一:

Set<CharSequence>某个地方得到了一个,这意味着我无法控制这个集合是如何创建的。

Set<CharSequence> dataSet = GET_DATA_SET();

我想将数据从 转换Set<CharSequence>Set<String>. 有没有一种有效的方法可以在不迭代每个元素的情况下进行这种转换?

场景二:

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

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

有没有一种有效的方法可以将此 Map 转换为Map<String, Car>不进行迭代?

4

6 回答 6

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

非常简单明了

于 2013-11-01T12:31:58.807 回答
1

如果您确定对象是Strings,那么您可以进行(未经检查的)强制转换,如果您的假设出错,您将得到一个ClassCastException

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

请注意,这是非常危险的,特别是如果Map来自外部库。我会循环Map将每个转换CharSequenceString.

您的问题是基于循环效率低下的假设,但是您确定吗?在您的情况下,这将是一个怎样的问题?现代编译器和硬件非常高效,您甚至可能没有注意到循环的区别。

于 2013-11-01T12:34:31.140 回答
0

如果您确定没有非字符串对象,只需将您的对象转换为Set<String>using

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

例子:

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

但这是非常肮脏和不安全的伎俩。

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

(Set<String>)((Set)dataSet);
于 2013-11-01T12:32:56.763 回答
0

尝试

 Set<String> dataSet = (Set<String>)(Set)GET_DATA_SET();
于 2013-11-01T12:33:12.553 回答
0

您可以使用此通配符:

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

这是安全和适当的。但是您必须记住,您的方法可能会返回对象,您将无法将其强制转换为 CharSequence 的某些继承者

于 2013-11-01T12:33:58.130 回答
0

不确定是否可以在 Java 核心中不进行迭代。也许,您可以使用 Guava 来做到这一点。看看Lists.transformCollections2.transform

于 2013-11-01T12:34:37.733 回答