オブジェクトの配列内の各項目を反復処理する for ループを設定しました。特定の項目の値が特定の文字列値と一致するかどうかを確認する if ステートメントがあります。もしそうなら、私はそれを画面に印刷したい。私はこれを行うのに問題はありません。ただし、一致するものが見つからずにループが終了した場合は、プログラムでエラー メッセージを出力する必要があります。if else ステートメントとして設定した方法では、一致しない場合、プログラムは各項目のエラー メッセージを出力します。ループが終了したら、それを行う方法がわかりません。どんなガイダンスでも大歓迎です。
6 に答える
コードで次のパターンを使用します。
boolean matchFound = false;
for (item: objects) {
if (item.equals(stringValue) {
//print item the same way as you did
matchFound = true;
}
}
if (!matchFound) {
System.out.println("No match found!");
}
一致が見つかったかどうかを格納するブール変数を作成します。ループが実行される前に false に設定し、ループ内で一致が見つかった場合は true にします。ループが終了してもまだ false の場合は、エラー メッセージを出力します。
boolean matchFound = false; // dont be so eager that there is a match
for(String each : lotOfStrings){
if(each.equals(someOtherStrings)){
matchFound = true;
// break; // optionally, you may break out
}
}
if(!matchFound){ // no match found?
System.out.println("Error");
}else{
System.out.println("Found a match");
}
上記のコード スニペットは、目的を達成する方法を示しています。
ケッピルのコメントに基づく
Keppil が示唆したように、少し最適化されています。
boolean matchFound = false;
for (int i = start; i < max && boolean == false; i++) {
if (foundElement()) {
matchFound = true;
}
}
if (!matchFound) {
log.error = "";
}
またはあなたができる
int i = start;
for (; i < max; i++) {
if (foundElement()) {
break;
}
}
if (i == max) {
log.error = "";
}
一致する特定のオブジェクトが必要ない場合、問題を処理する最もクリーンな方法は、検索を実行するヘルパー メソッドを作成することです。このようにして、ローカル変数の代入と再代入を回避でき、コードがかなりきれいになります。
boolean find(List<?> list, Object toFind) {
for (Object o : list) if (o.equals(toFind)) return true;
return false;
}
これは、文字列のリストやその他のオブジェクトに対して機能します。メインメソッドでは、次のように書くことができます
System.out.println((find(list, toFind)? "A" : "No") + " match was found");
一致するすべてのオブジェクトが必要な場合は、他の方法で印刷または処理できるように、すべての一致のリストを返すヘルパー メソッドを再度お勧めします。
<T> List<T> getMatches(List<T> list, Object toFind) {
final List<T> ret = new ArrayList<>();
for (T x : list) if (t.equals(toFind)) ret.add(x);
return ret;
}
これで、呼び出しメソッドで、次のことができます
final List<MyType> matches = find(inputList, toFind);
if (matches.isEmpty()) System.out.println("No match was found");
else { ... process the list as needed ... }
Keppil と Little Child には優れた解決策がありますが、仕様が変更されたときにこの問題を扱いやすくするリファクタリングを提案させてください。おそらくやり過ぎです。アルゴリズムのステップを分割します。 まず、一致のリストを取得します。 次に、それらをどうするかを決めます。例(最終的にはこのコードも分割したいでしょう)
ArrayList<T> matches = new ArrayList<T>; // T is your object type, e.g. String
for (T item : myObjects) {
if (item.equals(thingToMatch))
matches.add(item);
}
// ここで、リストをどうするかを決定します...
if (matches.size() > 0) {
for (T t : matches)
// print it here
// but in the future could log them, store in a database, convert to XML, etc...
}
else
System.out.println("no matches were found to " + thingToMatch);