2016-03-27 24 views
1

私のJavaルーチンを別のArrayList文字列のCharSequence引数として1つのArrayListから文字列を検索します。<code>String</code>別<code>ArrayList</code><code>String</code>の<code>char</code>シーケンスとして<code>ArrayList</code> 1からを見つける必要があり、Javaで8

ArrayListArrayListソースからStringアイテムを検索すると動作します。 ArrayListの項目に英数字のリテラルが多い場合は、charのシーケンスを使用して必要な部分を見つけようとしました。言葉で

ショート例:

ArrayList_A項目: "A0B"、 "C1D"、 "E2F"
ArrayList_Bアイテム: "A0B"

結果:BがArrayList_Aで見つかった項目アイテム(作品)

ArrayList_A項目: "A0B/C1D"、 "E2F"
ArrayList_Bアイテム: "A0B"

結果:項目Bは

以下は私の一部が動作するコードである(これは私が追加したいものである)ArrayList_Aアイテムで見つかりました。私は解決策から学ぶことができるように誰もそれを修正してもらえますか?

import java.util.ArrayList; 

public class Checking { 

    static void checkValues() { 

     ArrayList<String> arrayListA = new ArrayList(); 
     arrayListA.add("A0B/C1D"); 
     arrayListA.add("E2F"); 
     System.out.println("\narrayListA: " + arrayListA); 
     int sizeLA = arrayListA.size(); 
     System.out.println("arrayListA Length:" + sizeLA); 

     ArrayList<String> arrayListB = new ArrayList(); 
     arrayListB.add("A0B"); 
     arrayListB.add("E2F"); 
     System.out.println("\narrayListB: " + arrayListB); 
     int sizeLB = arrayListB.size(); 
     System.out.println("arrayListB Length:" + sizeLB); 

     ArrayList<String> arrayListFound = new ArrayList(); 

     //Something must be fixed here... 
     arrayListB.stream().forEach((searchStr) -> { 
      System.out.print("\nstr Search Item is: " + searchStr); 
      if(arrayListA.contains((CharSequence)searchStr)){ 
       System.out.print(" - found!"); 
       arrayListFound.add((String) searchStr); 
      } 
      else { 
       System.out.print(" - not found"); 
      } 
     }); 

     System.out.println("\n\narrayListFound Items: " + arrayListFound); 
     int sizeListFound = arrayListFound.size(); 
     System.out.println("sizeListFound Length :" + sizeListFound); 
     System.out.println("Expected to be fully found in arrayListFound: " + arrayListB); 
    } 

    public static void main(String[] args) { 
     checkValues(); 
    } 
} 

答えて

3

まず、あなたは機能的なスタイルのプログラミングを使用する必要があります。 forEachの()は、正確なサブストリングmatcingについて

ArrayList<String> arrayListFound = arrayListB.stream() 
      .filter(itemB -> arrayListA.stream() 
       .matchAny(itemA -> itemA.contains(itemB)) 
      ) 
      .collect(Collectors.toList()); 
+0

これを追加したいのですが、あなたが+1したので –

2

あなたは両方のコレクション経由でストリーミングし、String#containsの代わりList#containsを使用することができます。それは、このスニペットarrayListFound

arrayListB.stream().forEach(b -> 
    arrayListA.stream().forEach(a -> { 
     if (a.contains(b)){ 
      arrayListFound.add(b); 
     } 
    } 
)); 
+0

おかげで貢献してみんなにたくさん

ArrayList<String> arrayListFound = arrayListB.stream() .filter(arrayListA::contains) .collect(Collectors.toList()); 

をマッチングするために(...)

のための標準よりもあなたがより多くのことはできません。今私は理解し、それは動作します。 – Papske

0
if(arrayListA.contains((CharSequence)searchStr)){ 
    System.out.print(" - found!"); 
    arrayListFound.add((String) searchStr); 
} 

Aに含まれるBから対応するすべてのStringオブジェクトを追加します

は「私のリストは、まさにこの文字列が含まれている場合は、それが見つかった」と言います。しかし、あなたの文字列A0Bは、A0B/C1Dと同じではありません。両方のリストを繰り返し、メソッドがStringであり、ArrayListでないことを確認すると、必要なものが見つかります。例:

arrayListB.stream().forEach((searchStr) -> { 
    System.out.print("\nstr Search Item is: " + searchStr); 
    arrayListA.stream().forEach((sndStr) -> { 
     if (sndStr.contains(searchStr) || searchStr.contains(sndStr)) { 
      System.out.print(" - found!"); 
      arrayListFound.add((String) searchStr); 
     } else { 
      System.out.print(" - not found"); 
     } 
    }); 
}); 
0

実装をわずかに変更する代替ソリューションは次のとおりです。

arrayListB.stream().forEach((searchStr) -> { 
    if(arrayListA.stream().anyMatch(str -> str.contains((CharSequence)searchStr))){ 
     System.out.print(" - found!"); 
     arrayListFound.add((String) searchStr); 
    } 
    else { 
     System.out.print(" - not found"); 
    } 
}); 

i。 foreachよりも優れた性能を持つanyMatchを使用することができます。

ii。ここでは、サブストリングとしてarrayListBのsearchStrを持つarrayListAの文字列が存在するかどうかを確認しています。arrayListFoundリストを変異させずに、純粋に機能的なスタイルでそれを行うに

、次のようなアプローチを採用することができる。

Predicate<String> isInArrayA = searchStr-> arrayListA.stream().anyMatch(str -> str.contains(searchStr)); 
arrayListFound = (ArrayList<String>) arrayListB.stream() 
       .filter(isInArrayA) 
       .collect(Collectors.toList()); 
関連する問題

 関連する問題