【问题标题】:Change from CharSequence to String for Set<CharSequence> & Map<CharSequence, Object>Set<CharSequence> & Map<CharSequence, Object> 从 CharSequence 更改为 String
【发布时间】:2013-11-01 12:26:07
【问题描述】:

场景 1:

我从某处获得了Set&lt;CharSequence&gt;,这意味着我无法控制这个集合的创建方式

Set<CharSequence> dataSet = GET_DATA_SET();

我想将数据从Set&lt;CharSequence&gt; 转换为Set&lt;String&gt;。有没有一种有效的方法可以在不遍历每个元素的情况下进行这种转换?

场景 2:

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

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

有没有一种有效的方法可以将此 Map 转换为 Map&lt;String, Car&gt; 而无需迭代?

【问题讨论】:

  • 但是Set&lt;CharSequence&gt; 可以包含非字符串对象。所以,这样做是不安全的。
  • 我从某个地方得到了这些数据,我确信没有非字符串对象。这超出了我的问题范围。
  • 答案应该考虑问题的“不重复”事实。不确定是否有可能,因为即使任何 api 提供它也会进行迭代。
  • 谢谢大家。我决定遍历每个元素并转换为字符串。

标签: java swing jakarta-ee map set


【解决方案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());
    }

相当简单明了

【讨论】:

  • 为了安全起见,我决定遍历每个元素并转换为字符串。谢谢。
【解决方案2】:

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

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

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

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

【讨论】:

  • 或者直接使用Map&lt;String, Object&gt; stringDataMap = (Map) dataMap;
【解决方案3】:

试试

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

【讨论】:

  • 删除(Set&lt;String&gt;)
  • 谢谢。我决定遍历每个元素并转换为字符串。
【解决方案4】:

你可以使用这个通配符:

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

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

【讨论】:

  • A CharSequence 不是一个合适的集合成员:“这个接口没有细化 equals 和 hashCode 方法的一般约定。因此,比较两个实现 CharSequence 的对象的结果通常是,未定义。每个对象可以由不同的类实现,并且不能保证每个类都能够测试其实例是否与另一个类的实例相等。因此,将任意 CharSequence 实例用作集合中的元素是不合适的,或者作为地图中的键。” docs.oracle.com/javase/7/docs/api/java/lang/CharSequence.html
【解决方案5】:

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

【讨论】:

    【解决方案6】:

    如果您确定没有非字符串对象,只需将您的对象转换为 Set&lt;String&gt; 使用

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

    例子:

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

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

    编辑: 正如@LaurentG 所述,您可以这样做

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-03
      • 2011-10-30
      • 1970-01-01
      • 1970-01-01
      • 2011-08-17
      • 1970-01-01
      • 2011-04-05
      • 1970-01-01
      相关资源
      最近更新 更多