1

シナリオ 1:

つまり、このセットSet<CharSequence>どのように作成されたかを制御することはできません。

Set<CharSequence> dataSet = GET_DATA_SET();

Set<CharSequence>データを からに変換したいと思いSet<String>ます。各要素を反復せずにこの変換を行う効率的な方法はありますか?

シナリオ 2:

また、別のデータをHashMap型として取得します (繰り返しますが、この Map データの作成部分を制御することはできません)。

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

この Map をMap<String, Car>反復なしに変換する効率的な方法はありますか?

4

6 に答える 6

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 に答える
1

Eng.Fouadが言及さているように、すべてCharSequenceString.

したがって、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 に答える
0

Javaコアで反復なしで実行できるかどうかはわかりません。おそらく、Guava を使用してそれを行うことができます。を見てLists.transformCollections2.transform

于 2013-11-01T12:34:37.733 に答える
0

文字列以外のオブジェクトがないことが確実な場合は、オブジェクトを次のようにキャストするだけSet<String>です

(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 に答える