2016-02-16 78 views
5
String[] planets = new String[] { "Mercury", "Venus", "Earth", "Mars", 
        "Jupiter", "Saturn", "Uranus", "Neptune" }; 

我有一個簡單的行星名稱數組,我想反轉添加到數組中的每個名稱(而不是字符串順序)。
我繼續lambda語法奮鬥:Lambda表達式來反轉一個字符串 - Java

Arrays.sort(planets, (first, second) -> new StringBuilder(first).reverse().toString()); 
System.out.println(Arrays.toString(planets)); 

目前我得到:

Multiple markers at this line

  • The method reverse() in the type StringBuilder is not applicable for the arguments (String)
  • Type mismatch: cannot convert from String to int

響應:

謝謝大家的建議... asList讓我接近。我仍然沒有正確排序。

所以我需要找到一種方法,使array.sort工作,因爲這是分配(採取array.sort和lambda它)。

我已經指導老師要求澄清在這裏,但我沒有時間。

這是我的工作,試圖保持的Array.sort

  // lambda expression , long to short 
     System.out.println("5) Sorted by length (descending):"); 
     Arrays.sort(planets, (first, second) -> second.length() - first.length()); 
     System.out.println(Arrays.toString(planets)); 

     // lambda expression , reverse the name , then sort in ascending order 
     // hint use new StringBuilder(first).reverse().toString() to reverse the string 
     System.out.println("6) Sorted in dictionary order of the reversed name (ascending)"); 
     Arrays.sort(planets, (first, second) -> new StringBuilder(first).reverse().toString().compareTo(second)); 
     System.out.println(Arrays.toString(planets)); 

     // lambda expression , reverse the name , then sort in descending order 
     System.out.println("7) Sorted in dictionary order of the reversed name (descending)"); 
     Arrays.sort(planets, (first, second) -> new StringBuilder(second).reverse().toString().compareTo(first)); 
     System.out.println(Arrays.toString(planets)); 

我不能爲我的生活弄清楚什麼在這裏的是,所有3倍的表達讓我完全一樣的結果......每個那些給我原始數組排序最長到最短。

這是我的結果:

5)按​​長度排序(降序): [海王星,汞,木星,天王星,土星,金星,地球,火星]

6)在字典順序排序反向名稱在反轉名的字典順序排序(降序) [海王星,汞,木星(升序) [海王星,汞,木星,天王星,土星,金星,地球,火星]

7),天王星,土星,金星,地球,火星]

+10

你爲什麼要叫'Arrays.sort()'? –

+0

我正在使用Arrays.sort(),因爲我被要求做家庭作業。 –

回答

8

不就地使用流API並更新串的替代解決方案:

Arrays.asList(planets).replaceAll(s -> new StringBuilder(s).reverse().toString()); 

演示:

String[] planets = new String[] { "Mercury", "Venus", "Earth", "Mars", 
     "Jupiter", "Saturn", "Uranus", "Neptune" }; 
Arrays.asList(planets).replaceAll(s -> new StringBuilder(s).reverse().toString()); 
System.out.println(Arrays.toString(planets)); 
// [yrucreM, suneV, htraE, sraM, retipuJ, nrutaS, sunarU, enutpeN] 
+3

'replaceAll()'..嗯有趣的方法.. :) :) – TheLostMind

4

這會爲你做它:

public static void main(String[] args) { 
    String[] arr = {"earth", "mars", "mercury"}; 
    List<String> ll = Arrays.stream(arr).map(s -> new StringBuilder(s).reverse().toString()).collect(Collectors.toList()); 
    System.out.println(ll); 
} 

O/P:

[htrae, sram, yrucrem] 

或者,如果你只想打印,使用:

String[] arr = {"earth", "mars", "mercury"}; 
Arrays.stream(arr).map(s -> new StringBuilder(s).reverse().toString()).forEach(System.out::println); 

O/P:

htrae 
sram 
yrucrem 
+2

如果你打算直接用鏈接forEach打印結果,你可以省略'.toString()'調用... – Holger

+1

@Holger - 是的。這是正確的 – TheLostMind

2

Arrays.sort需要一個比較器作爲第二個參數。它可以用一個lambda表達式來實現,該表達式將兩個字符串作爲參數(在您的情況下)並返回一個整數(這是在Comparator接口中定義的SAM的要求)。

(first, second) -> new StringBuilder(first).reverse().toString() 

是λ表達式採用兩個字符串(類型是由編譯器推斷出),但它返回一個字符串,而不是一個整數,因此錯誤:

java: incompatible types: cannot infer type-variable(s) T 
    (argument mismatch; bad return type in lambda expression 
     java.lang.String cannot be converted to int) 

I have a simple array of planet names and I want to reverse each name that was added to the array

在這種情況下,你可以簡單地使用Arrays.setAll修改到位數組:

Arrays.setAll(planets, i -> new StringBuilder(planets[i]).reverse().toString()); 
+0

所以這裏是我的代碼:Arrays.setAll(行星,我 - >新的StringBuilder(行星[i])。reverse()。toString ));但我得到以下嘗試:方法setAll(String [],(我) - > {})是未定義類型數組 –