2017-07-14 1 views
1

文字列(userInputと呼ばれます)と一致させる最良の方法を見つけようとしています。この文字列は他のいくつかの連結の結果です文字列(を承認したとの例では、私が呼ばれるのArrayListまたは配列)arraylistの文字列がarraylistからの連結の結果であるところ

ArrayList<String> approved = new ArrayList<>(); 
approved.add("abc"); 
approved.add("def"); 
approved.add("ghi"); 
approved.add("def jkl ggwp my life"); //repeated elements (abc,jkl) 
approved.add("jkl"); 
approved.add("mno"); 
approved.add("pqr"); 
approved.add("stu vwx"); 
approved.add("yz"); 

私はちょうど私が持っている、現実の世界では、私のdifficulty.Butを説明するために(上記の)このArrayListのを使用します

-fixed arraylist which wont have dynamic elements (the elements in the arraylist wont change) 
    -arraylist with more than 6000 elements 
    -elements in the arraylist contains multiple word e.g ("stu vwx") 
    -repeated elements but concatenated with another string in the arraylist 
以下は、 USERINPUT

userInput = "yza"; //obviously it doesnt match anything 
userInput = "ghi jk"; //doesnt match the concatenated string (ghi and jkl) 
userInput = "pqr stu v"; //it can split the element with whitespace,but it has to take the whole word 
userInput = "def abc"; //the order are important 

イムであればプログラムは次はUSERINPUTある場合はtrueを返し

userInput = "abc def"; 
userInput = "stu vwx yz"; //they can combine with another element as a whole 
userInput = "ghi"; //it doesnt have to combine with another element 
userInput = "vwx yz"; //they can split the arraylist elements with whitespace only and concatenate it with another element 

しかし、プログラムが偽を返すもの

ユーザー入力を分割すると考えてfirstWordlastWordですので、にはが含まれており、arraylist内のインデックスを見つけることができます。

firstWordfirstWord以来lastWordを(そのジョブを実行し、文字列を持っている要素の複数のインデックスを返します)(.contains、のはここから

String userInput = "def ghi jkl mno"; 
//so,the firstWord and lastWord will be 
firstWord = "def"; 
lastWord = "mno"; 

を言うをしてみましょうarrylistでが複数回出現した場合)、別の配列で可能な一致を返すように設定されます。

firstWordPossibleIndex[] = {1,4}; 
lastWordPossibleIndex[] = {6}; 

順序が重要であるので、ここでのロジックはfirstWordPossibleIndexlastWordPossibleIndexよりも低い値が含まれている必要があり、そう、任意の大きな値があるかどう提供する文字列があることになるので、それを除去することができるということです無効。

そのロジックを実装した後、それはこの場合には意味lastWordPossibleIndex

firstWordPossibleIndexから次のインデックスをマッチング開始する必要があり、それは、USERINPUTで2番目の単語をチェックし、一致しようとするだろう2及び5のインデックスを持つ要素とそれがlastwordPossibleIndex までチェックする

のでfirstWordPossibleIndex 1および4です)と、すべての単語がarraylistに従って順番に並んでいる場合は、trueを返します。

これで、私はまだの文字列と一致する文字列と一致しています。と別の文字列の一部が一致しています。これを解決する考えはありますか?

これを解決するライブラリがありますか?

答えて

0

あなたはこのような何か試すことができます。

import java.util.ArrayList; 
import java.util.List; 

public class WhatSoEver{ 

    static int order; 

    public static void main(String[] args) { 

     ArrayList<String> approved = new ArrayList<>(); 
     approved.add("abc"); 
     approved.add("def"); 
     approved.add("ghi"); 
     approved.add("def jkl ggwp my life"); 
     approved.add("jkl"); 
     approved.add("mno"); 
     approved.add("pqr"); 
     approved.add("stu vwx"); 
     approved.add("yz"); 

     System.out.println(isValid(approved, "abc def")); // true 
     System.out.println(isValid(approved, "stu vwx yz")); // true 
     System.out.println(isValid(approved, "ghi")); // true 
     System.out.println(isValid(approved, "vwx yz")); // true   

     System.out.println(isValid(approved, "yza")); // false 
     System.out.println(isValid(approved, "ghi jk")); //false 
     System.out.println(isValid(approved, "pqr stu v")); //false 
     System.out.println(isValid(approved, "def abc")); //false 

    } 

    public static boolean isValid(List<String> approved, String userInput){ 
     order=0; 
     for(String word : userInput.split(" ")){ 
      if(!containsWord(approved, word)){ 
       return false; 
      } 
     } 
     return true; 
    } 

    private static boolean containsWord(List<String> approved, String word){ 
     for(int i=0; i<approved.size(); i++){ 
      for(String subS : approved.get(i).split(" ")){ 
       if(word.equals(subS) && (i+1)>order){ 
         order=i; 
         return true; 
       } 
      } 
     } 
     return false; 
    } 
} 

出力を

true 
true 
true 
true 
false 
false 
false 
false 
0

最初に、「def jlk ggwp my life」のようなエントリを各部分(この場合は5個)に分割し、リストに別々に追加する必要があります。その後、スペースでユーザーの入力を分割し、配列にそれを保存し、ちょうど

approved.contains(入力配列の要素)アレイ内のすべての要素が承認された配列リスト中に存在している場合

、その後、リターンを行います本当。いずれかが承認済みリストにない場合は、falseを返します。

0
public static void main(String[] args) { 
    ArrayList<String> approved = new ArrayList<>(); 
    approved.add("abc"); 
    approved.add("def"); 
    approved.add("ghi"); 
    approved.add("def jkl ggwp my life"); //repeated elements (abc,jkl) 
    approved.add("jkl"); 
    approved.add("mno"); 
    approved.add("pqr"); 
    approved.add("stu vwx"); 
    approved.add("yz"); 

    String[] userInput ={"abc def","stu vwx yz","ghi","vwx yz","yza","ghi jk","pqr stu v","def abc"}; 
    for(String str: userInput){ 
     System.out.println(str+"\t"+check(str,approved)); 
    } 
} 

public static boolean check(String userInput, ArrayList<String> list){ 
    String joined = String.join(" ", list)+" ";   
    return joined.contains(userInput+" "); 
} 
関連する問題