73

.contains()メソッドでケースを無視するオプションはありますか?

私はArrayListDVDオブジェクトを持っています。各 DVD オブジェクトにはいくつかの要素があり、そのうちの 1 つがタイトルです。そして、特定のタイトルを検索するメソッドがあります。動作しますが、大文字と小文字を区別しないようにしたいと思います。

4

17 に答える 17

186

Java 8 を使用している場合

List<String> list = new ArrayList<>();

boolean containsSearchStr = list.stream().anyMatch("search_value"::equalsIgnoreCase);
于 2016-07-18T11:21:05.907 に答える
34

文字列を検索するときに大文字と小文字を区別しないということですか?

何もわかりませんが、検索する文字列を小文字または大文字に変換してから検索してみてください。

// s is the String to search into, and seq the sequence you are searching for.
bool doesContain = s.toLowerCase().contains(seq);

編集: Ryan Schipper が示唆したように、状況に応じて seq.toLowerCase() を実行することもできます (おそらくそのほうがよいでしょう)。

于 2013-04-05T02:08:30.663 に答える
8

Java 8 では、Stream インターフェイスを使用できます。

return dvdList.stream().anyMatch(d -> d.getTitle().equalsIgnoreCase("SomeTitle"));
于 2016-07-25T21:43:02.580 に答える
4

これはおそらく、特定の問題に対する最良の方法ではありませんが、String.matches(String regex)メソッドまたは同等のマッチャーを使用できます。予想されるタイトルから正規表現を作成するだけです。ここで複雑になります。

List<DVD> matchingDvds(String titleFragment) {
    String escapedFragment = Pattern.quote(titleFragment);
    // The pattern may have contained an asterisk, dollar sign, etc.
    // For example, M*A*S*H, directed by Robert Altman.
    Pattern pat = Pattern.compile(escapedFragment, Pattern.CASE_INSENSITIVE);
    List<DVD> foundDvds = new ArrayList<>();
    for (DVD dvd: catalog) {
        Matcher m = pat.matcher(dvd.getTitle());
        if (m.find()) {
            foundDvds.add(dvd);
        }
    }
    return foundDvds;
}

しかし、これは非効率的であり、純粋に Java で行われています。次のいずれかの方法を試してみてください。

  1. CollatorおよびCollationKeyクラスを学習します。
  2. やむを得ず Java の世界にとどまる場合は、メソッドを DVD に追加しboolean matches(String fragment)ます。DVD に一致するものを教えてもらいます。
  3. データベースを使用します。大文字と小文字を区別しない照合がサポートされている場合は、テーブルのtitle列をそのように宣言します。DVDJDBC、Hibernate、JPA、Spring Data のいずれかを使用します。
  4. データベースが Oracle などの高度なテキスト検索をサポートしている場合は、それを使用します。
  5. Java の世界に戻って、Apache Luceneおそらく と を使用しますApache Solr
  6. 大文字と小文字を区別しない一致用に調整された言語を使用します。

Java 8 まで待つことができる場合は、ラムダ式を使用してください。このように正規表現を構築することで、上で使用した Pattern および Matcher クラスを回避できます。

   String escapedFragment = Pattern.quote(titleFragment);
   String fragmentAnywhereInString = ".*" + escapedFragment + ".*";
   String caseInsensitiveFragment = "(?i)" + fragmentAnywhereInString;
   // and in the loop, use:
   if(dvd.getTitle().matches(caseInsensitiveFragment)) {
        foundDvds.add(dvd);
    }

しかし、これはパターンを何度もコンパイルします。すべてを小文字にするのはどうですか?

if (dvd.getTitle().toLowerCase().contains(titleFragment.toLowerCase()))

おめでとう; トルコ語の問題を発見したところです。でロケールを指定しない限りtoLowerCase、Java は現在のロケールを検索します。また、トルコ語のドットなし i とドット付き I を考慮に入れる必要があるため、小文字化は遅くなります。少なくとも、パターンもマッチャーもありません。

于 2013-04-05T02:34:36.387 に答える
2

String常にオブジェクトを取得すること、または で作業しているオブジェクトがList大文字と小文字を区別しない方法を実装することを保証することはできません。

コレクション内の s を大文字と小文字を区別しないものと比較したいString場合は、コレクションを繰り返し処理し、大文字と小文字を区別せずに比較する必要があります。

String word = "Some word";
List<String> aList = new ArrayList<>(); // presume that the list is populated

for(String item : aList) {
    if(word.equalsIgnoreCase(item)) {
        // operation upon successful match
    }
}
于 2013-04-05T02:04:18.330 に答える
0
 private List<String> FindString(String stringToLookFor, List<String> arrayToSearchIn)
 {
     List<String> ReceptacleOfWordsFound = new ArrayList<String>();

     if(!arrayToSearchIn.isEmpty())
     {
         for(String lCurrentString : arrayToSearchIn)
         {
             if(lCurrentString.toUpperCase().contains(stringToLookFor.toUpperCase())
                 ReceptacleOfWordsFound.add(lCurrentString);
         }
     }
  return ReceptacleOfWordsFound;
 }
于 2013-11-27T17:27:39.830 に答える
-1

これにちょっとしたトリックを適用できます。
すべての文字列を同じケースに変更します:大文字または小文字のいずれか
C# コードの場合:

list searchResults = sl.FindAll(s => s.ToUpper() .Contains( seachKeyword.ToUpper() ));

Java コードの場合:

import java.util.*; 

class Test
{
    public static void main(String[] args)
    {
        String itemCheck="check";
        ArrayList<String> listItem =new ArrayList<String>();
        listItem.add("Check");
        listItem.add("check");
        listItem.add("CHeck");
        listItem.add("Make");
        listItem.add("CHecK");
        for(String item :listItem)
        {
            if(item.toUpperCase().equals(itemCheck.toUpperCase()))
            {
                System.out.println(item);
            }
        }

    }

}
于 2015-07-27T07:51:23.223 に答える