2012-04-03 1 views
1

String配列をLong配列またはListに分解したいと考えています。 私はループを使いたくありません。JAVAでループのないLongのリストまたはLongのリストに文字列を分解する

これを行うJavaメソッドはありますか。あなたは今long値の数がStringに含まれている場合を除き

+0

したがって、配列には 'long'sの文字列表現が含まれていますか?もっと具体的にする必要がありますし、あなたはそれをあなた自身で解決しようとしています。 –

+0

[this](http://stackoverflow.com/questions/9993916/decompose-a-string-into-array-of-int-without-loop-java)の質問が最近尋ねられました。 – darrengorman

+1

@milkplusvellocet:いいえ、もう一つの質問は、文字列をintの配列に解析することです。この質問は、 "変換"部分を定義することなく、文字列配列をLong配列に "変換"することです。 –

答えて

6

String[](数字列)を「long[]」に「変換する」O(1)操作はありません。ループが表示されているか、または第三者の方法で隠れている場合は、常にO(n)になります。

あなたはループを「見る」したくない場合は、単にメソッドに

Long[] pseudoOneStepConversion(numbers); 

を実装し、我々はあまりにも再帰的にそれを行うことができます

privat Long[] pseudoOneStepConversion(String[] numbers) { 
    Long[] result = new long[numbers.length]; 
    for (int i = 0; i < numbers.length; i++) 
    result[i] = Long.parseLong(numbers[i]); 
    return result; 
} 

を実装する - それはまだありますO(n)、パフォーマンスが低下し、ループのように見えない:

public static void main(String[] args) { 
    List<Long> target = new ArrayList<Long>(); 
    copy(new String[]{"1", "2", "3"}, target, 0); 
    System.out.println(target); 
} 

private static void copy(String[] source, List<Long> target, int index) { 
    if (index == source.length) 
     return; 
    target.add(Long.parseLong(source[index])); 
    copy(source, target, index+1); 
} 
私は再帰例えばdownvotesを取得を開始するので -

注: - ;あなたがコーディングを避けることができ3rd party librariesの少しの助けを借りて)

+0

これは時間の複雑さについてではなく、コードの簡潔さについて考えています。私が読んでいるように、OPには関数型プログラミングの 'map'のようなものが必要です(私はGuavaがそういうものを持っていると思います)。 –

+0

JavaでUnforunately、ループはこれらのケースの多くで最も簡潔に/読み取り可能な形式です。おそらく、クロージャはJava 8でこれを変更します。 –

+0

投票が減少します。なぜなら、再帰はJavaでははるかに悪いプレーンループを実行するからです。 JVM JITコンパイラのターゲット・ループには最適化がありますが、現時点ではLispや他のいくつかのVMとは異なり、JVMでの末尾再帰の最適化はありません。 –

1

なしループせずにこれを実行する方法は、(あなたが明示的にループをコーディングしていない場合でも、あなたが呼び出すメソッドは、いずれかを使用します)が存在しないとListに手動で追加してください。

+1

もちろん、テールの再帰があります。それがプロセッサレベルになると、*すべての制御構造はgoto *です。また、ヘルパー関数がループを使用する場合、反復反復でコードを書き直す必要がない限り、OPの問題ではないと私は考えています。 –

4

をそれは純粋に学術および製品コードで使用するためにintededではないことが明らかになった、と思いましたあなた自身のコードでループしますが、フードのどこかにループが存在します。たとえば:

List<String> stringList = Arrays.asList(stringArray); 
List<Long> longList = Lists.transform(stringList, new Function<String, Long>() { 
    public Long apply(String s) { 
     return Long.valueOf(s); 
    } 
}); 

クラスListsFunctionはグアバライブラリからです。

1

あなたの最善の選択肢はGuavas Lists.transformです。

String[] stringArray = {"1999", "20000"}; 
List<String> stringList = Arrays.asList(stringArray); 
List<Long> longList = Lists.transform(stringList, 
             new Function<String, Long>() { 
               Long apply(String value) { 
               return Long.valueOf(value); 
             } 
         }); 

注:Guavaはもちろんこれを実現するためにループを実行する必要がありますが、コードにループはありません。

+0

「公然」がなければ、それは驚くほどユージーンの答えに似ています... –

+0

LOL :-)いいえ私はそれをコピーしませんでした – Zapodot

2

グアバ(Guava)ライブラリで簡略化されたユージーン解答。 Guava 16.0以降。

List<Long> longList = Lists.transform(Arrays.asList(stringArray), Longs.stringConverter()); 
関連する問題