2012-04-03 34 views
1

我想將字符串數組分解爲長整數或列表。 我不想使用循環。將字符串分解爲長整型數組或長整型列表,而不使用循環在JAVA中

是否有任何Java方法來做到這一點。

+0

那麼這個數組包含'long's的字符串表示?你需要更具體,包括所需的輸入/輸出和你自己解決它的嘗試。 – 2012-04-03 13:24:48

+0

最近問了一個[this]的重複(http://stackoverflow.com/questions/9993916/decompose-a-string-into-array-of-int-without-loop-java)。 – darrengorman 2012-04-03 13:27:44

+1

@milkplusvellocet:不,另一個問題是關於將字符串解析爲一個整數的數組。這個問題是關於將字符串數組「轉換」爲長數組(不定義「轉換」部分) – 2012-04-03 13:29:45

回答

6

沒有O(1)操作將「String[]」(使用數字字符串)「轉換」爲long[]。如果循環可見或隱藏在某些第三方方法中,它將始終爲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的遞歸例子:這是純粹的學術,而不是inteded在生產代碼中使用 - 認爲,這是明確的;)

+0

我認爲這不是時間複雜性,而是關於代碼的簡潔性。當我閱讀它時,OP在函數式編程中需要類似'map'的東西(我認爲Guava有類似的東西)。 – 2012-04-03 13:31:12

+0

Java中不幸的是,循環是許多情況下最簡潔/可讀的形式。也許閉包會在Java 8中改變這種狀況。 – 2012-04-03 13:41:31

+0

下投票,因爲在Java中,遞歸執行得更糟,然後執行純循環。 JVM JIT編譯器針對循環進行了優化,但目前沒有針對JVM中的尾遞歸進行優化(與Lisp和其他幾個VM不同)。 – 2012-04-04 17:18:59

1

沒有就沒有辦法做到這一點沒有環(即使你沒有明確編寫一個循環,你會叫會使用一種方法),除非你現在包含在Stringlong值的數量和將它們手動添加到您的List

+1

當然有:尾遞歸。當涉及到處理器層面時,*所有控制結構都轉到*。另外,如果輔助函數使用循環,我不認爲這會對OP造成問題,只要他不必通過重複迭代來監控他/她的代碼即可。 – 2012-04-03 13:31:32

4

隨着3rd party libraries一點點幫助,您可以避開編碼在你自己的代碼中循環,但是會有一個循環在某個地方。例如:

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

注:當然番石榴必須做一個循環來實現這一點,但在你的代碼中沒有循環。

+0

缺少一個'public',否則它與Eugene的答案令人驚訝地相似... – 2012-04-03 13:33:39

+0

LOL :-)否我沒有複製它 – Zapodot 2012-04-03 13:36:42

2

Simplified Eugene回答Guava圖書館。自番石榴16.0。

List<Long> longList = Lists.transform(Arrays.asList(stringArray), Longs.stringConverter()); 
相關問題