.contains()
メソッドでケースを無視するオプションはありますか?
私はArrayList
DVDオブジェクトを持っています。各 DVD オブジェクトにはいくつかの要素があり、そのうちの 1 つがタイトルです。そして、特定のタイトルを検索するメソッドがあります。動作しますが、大文字と小文字を区別しないようにしたいと思います。
Java 8 を使用している場合
List<String> list = new ArrayList<>();
boolean containsSearchStr = list.stream().anyMatch("search_value"::equalsIgnoreCase);
文字列を検索するときに大文字と小文字を区別しないということですか?
何もわかりませんが、検索する文字列を小文字または大文字に変換してから検索してみてください。
// 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() を実行することもできます (おそらくそのほうがよいでしょう)。
Java 8 では、Stream インターフェイスを使用できます。
return dvdList.stream().anyMatch(d -> d.getTitle().equalsIgnoreCase("SomeTitle"));
これはおそらく、特定の問題に対する最良の方法ではありませんが、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 で行われています。次のいずれかの方法を試してみてください。
Collator
およびCollationKey
クラスを学習します。boolean matches(String fragment)
ます。DVD に一致するものを教えてもらいます。title
列をそのように宣言します。DVD
JDBC、Hibernate、JPA、Spring Data のいずれかを使用します。Apache Lucene
おそらく と を使用しますApache Solr
。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 を考慮に入れる必要があるため、小文字化は遅くなります。少なくとも、パターンもマッチャーもありません。
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
}
}
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;
}
これにちょっとしたトリックを適用できます。
すべての文字列を同じケースに変更します:大文字または小文字のいずれか
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);
}
}
}
}