15

toString()表現がありArrayListます。

値をクリップボードにコピーして、それを IDE エディターにコピーし直し、インスタンスを 1 行でtoString()作成したいと考えています。ArrayList実際、私が実際に行っていることは次のとおりです。

  • 私の ArrayList.toString() には、単体テストをセットアップするために必要なデータがあります。
  • この ArrayList.toString() をエディターにコピーして、このエッジ ケースに対するテストを作成したいと考えています。
  • 手で何かを解析したくない

私の入力は次のようになります。

[15.82, 15.870000000000001, 15.92, 16.32, 16.32, 16.32, 16.32, 17.05, 17.05, 17.05, 17.05, 18.29, 18.29, 19.16]

以下は機能しません。

  • Arrays.asList()
  • グーグル コレクションLists.newArrayList()

提案?

4

6 に答える 6

27

中かっこを部分的に切り離し、分割(コンマ,とスペース) して、最後に にフィードしArrays#asList()ます。

 String s = "[15.82, 15.870000000000001, 15.92, 16.32, 16.32, 16.32, 16.32, 17.05, 17.05, 17.05, 17.05, 18.29, 18.29, 19.16]";
 List<String> list = Arrays.asList(s.substring(1, s.length() - 1).split(", "));

これは特定のケースで機能しますが、すべての状況で機能するわけではないことに注意してください。たとえば、少なくとも 1 つに後続のコンマとスペースが含まれる文字列のリストがあるとします。その後、分割は失敗します。

于 2010-05-05T14:39:03.453 に答える
3

一般に、toString()オブジェクトの には、元のオブジェクトを再現するための情報が含まれていません。これ以上の情報は必要ありません。

あなたの特定のケースでは、例は多くの異なるインスタンス(および同一ArrayListの他のほとんどすべての実装)の実装によって生成される可能性があります。ListtoString()

極端な例として、content を持つArrayList単一の要素を含む を考えてみてください。これにより、元の とまったく同じ出力が生成されます。また、2 つの異なる入力が同じ出力を生成するため、追加情報なしでこの関数を元に戻すことはできません。String15.82, 15.870000000000001, 15.92, 16.32, 16.32, 16.32, 16.32, 17.05, 17.05, 17.05, 17.05, 18.29, 18.29, 19.16ArrayListArrayList

ただし、オリジナルのコンテンツ タイプなどの追加情報があれば、場合によってArrayListは可能になります。Listのすべての要素が 型であることがわかっている場合Double、実際には非常に簡単です。

public static List<Double> stringToList(final String input) {
    String[] elements = input.substring(1, input.length() - 1).split(", ");
    List<Double> result = new ArrayList<Double>(elements.length);
    for (String item : elements) {
        result.add(Double.valueOf(item));
    }
    return result;
}

確かに、それはワンライナーではありませんが、それほど悪くはありません.

于 2010-05-05T14:43:12.223 に答える
1

これは機能しますが、おそらく誰かがもっとエレガントなものを持っていますか?

    List<String> list = Lists.newArrayList(Splitter.on(",").omitEmptyStrings().split("JUN10, SEP10, DEC10, MAR11, JUN11, SEP11, DEC11, MAR12, JUN12, SEP12, DEC12, MAR13, DEC13, DEC14"));
    assertEquals(14, list.size());
于 2010-05-05T14:37:17.330 に答える
0

この ArrayList.toString() をエディターにコピーして、このエッジ ケースに対するテストを作成したいと考えています。

コピーしている場合は、角括弧を省略して値をコピーして、

Arrays.asList(...) ?
于 2010-05-05T14:46:58.493 に答える
0

コピーペーストソリューションを探しているだけの場合は、

    Arrays.asList(15.82, 15.870000000000001, 15.92, 16.32, 16.32, 16.32, 16.32, 17.05, 17.05, 17.05, 17.05, 18.29, 18.29, 19.16);

つまり、引用符と角括弧を asList() に入れる前に削除してください。これにより、新しい ArrayList を簡単に作成できる List が得られます。

データが double よりも複雑な場合は、それらを解析する方法を見つける必要がある場合があります。

于 2010-05-05T14:47:27.923 に答える
0

「1行でなければならない」という要件により、カプセル化するヘルパーメソッドを作成しない限り、チェーンされたAPI呼び出しの醜い混乱が発生することがほぼ確実になります。

ちょっと見にくいですが、dotnetnewbie のアプローチに似ています。

List<String> result = Arrays.asList(listString.substring(1, listString.length()-1).split(",\\s*"));

袖口から外れているので、かなりきれいにできると確信しています。

よりエレガントで読みやすいアプローチは、数行に分割するか、文字列で呼び出して出力を返すことができるテスト ケース (または Util クラス) のヘルパー メソッドにリファクタリングすることです。あなたが望むこと。

于 2010-05-05T14:48:27.233 に答える