2017-11-28 3 views
-1

私はsearchtextという名前のテキストフィールドを持っていて、それはユーザーの入力です。ボタンをクリックすると、csvファイルからインポートされた9126の値を持つリストが検索され、ラベルにユーザーの入力がある行が印刷されます。私は必要なものでは正確にJavaの検索としてユーザーの入力を使ってリストから特定の行を印刷する方法

public void search(ActionEvent actionEvent) throws IOException{ 
    ArrayList<String> list=new ArrayList<>(); 
    Scanner scanner = new Scanner(file);   //I have a file named "something.csv" 
    while (scanner.hasNextLine()) { 
     list.add(scanner.nextLine()); 
    }            //now i have all 9126 lines in the list 
    String search = searchtext.getText().replaceAll("\\s", ""); //searchtext is the users input 
    if (list.contains(search)){ 
     //PRINT THE LINE THAT CONTAINS WHAT THE USER WROTE 
    } 
} 

:私のリストの中に私は、この値1,Toy Story (1995),Adventure|Animation|Children|Comedy|Fantasyを持っています。私が欲しいのは、ユーザーがを検索フィールド1,Toy Story (1995),Adventure|Animation|Children|Comedy|Fantasyに入力したときにラベルに印刷されます。私はToyがそうのような.contains()によって読み取られるかどうかを確認するためのテスト作成:

if (list.contains(search)){ 
     //PRINT THE LINE THAT CONTAINS WHAT THE USER WROTE 
     System.out.println("in the list"); 
    }else{ 
     System.out.println("outside the list"); 
    } 

をしかし、私は正確に1,Toy Story (1995),Adventure|Animation|Children|Comedy|Fantasyを入力するいけない場合"outside the list"を取得することです。だから私は私の質問は、キーワードのリストを検索し、その行を印刷するメソッドを作成する方法だと思います。最も簡単な方法は、すべての行をループになると、あなたはマッチング結果を見つけたら壊す

+0

'list'は文字列の配列です。明らかに、 'list'のすべての要素をループし、そのループで' contains'を使う必要があります。 – jrook

+0

「印刷する」方法がわからないか、「印刷する」正しい行を見つける方法がわかりません。また、「印刷物」はとても一般的なものなので、正確に何をすべきか? – Jai

+0

'list.contains(search)'が真の場合、検索テキストを含む行は 'search'と全く同じです。だから、 'label.setText(search)'だけが必要です。しかし、たとえそれがあなたが書いた論理であっても、それはあなたが意図した論理ではないかもしれません。 –

答えて

0

に一致する最初の要素を見つけます。しかし、あなたが探している言葉を持っている行がもっとあればどうでしょうか?

このforループを使用すると、私が探していた特定の単語を持つ行を取得できました。これが誰かを助けることができるといいですね。

0

(あなたが唯一の最初の結果に興味がある場合)

for (String line : list) { 
    if (line.contains(search)){ 
     //PRINT THE LINE THAT CONTAINS WHAT THE USER WROTE 
     return; 
    } 
} 
// HANDLE EMPTY RESULT 

代わりに、あなたもするためにJava 8つのストリームを使用することができます Files.lines(file.toPath()).filter(line -> line.contains(search)).findFirst().ifPresent(searchtextarea::setText)‌​;のみリストかもしれないが、あなたが.findAny()を使用していても、含まれている最初の行を設定し、興味があるかもしれません、誰のための条件

String result = list.stream().filter(line -> line.contains(search)) 
     .findFirst() 
     .orElse(null); 
if (result == null) { 
    // HANDLE EMPTY RESULT 
    return; 
} 
// DO SOMETHING WITH THE LINE CONTAINING WHAT THE USER WROTE 
+2

ストリームを使用している場合、スキャナとリストを完全に省略することができます: 'Files.lines(file.toPath())。filter(line-> line.contains(search))。findFirst()。ifPresent(label :: setText ); '。これがOPが望んだものだと仮定すると、もちろん... –

関連する問題