簡體   English   中英

用於反轉字符串的 Lambda 表達式 - Java

[英]Lambda Expression to reverse a string - Java

String[] planets = new String[] { "Mercury", "Venus", "Earth", "Mars", 
                  "Jupiter", "Saturn", "Uranus", "Neptune" };

我有一個簡單的行星名稱數組,我想反轉添加到數組中的每個名稱(不是字符串順序)。
我繼續與 lambda 語法作斗爭:

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

目前我得到:

此行有多個標記

  • StringBuilder類型中的方法reverse()不適用於參數(String)
  • 類型不匹配:無法從String轉換為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)按字典順序倒序排序(降序)[海王星、水星、木星、天王星、土星、金星、地球、火星]

不使用 Stream 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]

這將為您完成:

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

開/關:

[htrae, sram, yrucrem]

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

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

開/關:

htrae
sram
yrucrem

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

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

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

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)

我有一個簡單的行星名稱數組,我想反轉添加到數組中的每個名稱

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

Arrays.setAll(planets, i -> new StringBuilder(planets[i]).reverse().toString());
// Sort and reverse
String[] planetsOne = new String[] { "Mercury", "Venus", "Earth", "Mars", 
        "Jupiter", "Saturn", "Uranus", "Neptune" };
  String temp [ ] = Arrays.stream(planetsOne).sorted(Comparator.reverseOrder()).toArray(String[ ] ::new);
      for(String node : planetsOne) {
      System.out.print("     "+ node);
      }
      
      System.out.println("\n ");
      
      // only reverse does not sort
    String[] planetsTwo
    = new String[] { "Mercury", "Venus", "Earth", "Mars", 
            "Jupiter", "Saturn", "Uranus", "Neptune" };
    
      Collections.reverse(Arrays.asList(planetsTwo));
      for(String node : planetsTwo) {
      System.out.print("     "+ node);
      }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM