配列の中央にある要素の1つを「削除」しない場合は、配列内の要素を配置して「削除」し、印刷することもできます。これは、コードでは0が表示されるまでしか表示されないためです。 0は、印刷が停止する配列内の要素です。 私はこれをやってみました:
public static void showUsers(){
for(int i = 0; i <= 100 ; i++){
if(users[i] == 0 && i == 0){
System.out.println("There's no users");
//goes back to the main menu
return;
}else if(users[i] == 0){
//goes back to the main menu
return;
}
System.out.println("List of Users: " + users[i]);
}
//goes back to the menu
return;
}
do-whileループも使用してみました:
public static void showUsers(){
int i=0;
if(users[i] == 0 && i == 0){
System.out.println("There's no users");
//goes back to the main menu
return;
}
do{
if(users[i] == 0){
i++;
return;
}
System.out.println("List of Users:" + users[i]);
i++;
}while(users[i] == 0 || i <= 100);
//goes back to the main menu
return;
}
したがって、3人のユーザー(1,2,3,0,0,0、....)を作成すると、数値1、2、および3が出力されますが、数値2を「削除」すると、配列は( 1,0,3,0,0,0、....)数値1のみが出力されます。これは、私が試した両方のケースで発生します。
私が欲しかったのは、2番を「削除」した後、1番と3番を印刷することです。
印刷方法や「削除」方法を変更する必要がありますか?
回答 2 件
あなたは方法を使うことができます
IntStream.filter
この目的のために:int[] users = {1, 0, 2, 3, 0, 0}; Arrays.stream(users) // filter out zero users .filter(user -> user != 0) // print users in one line .forEach(user -> System.out.println(user + ", "));
出力:
1, 2, 3,
まず、コードがそのように動作するのはなぜですか?ループ内のコードは、ループのすべての反復で実行されます。したがって、そこにifステートメントがあり、ifステートメントの本体にreturnが含まれている場合、メソッドは、任意の反復でifステートメントがtrueになるとすぐに戻ります。
次に、コードを修正します。特定の反復をスキップするには、
continue
ステートメント。これにより、forループは次の反復に進みますが、ないメソッドから戻ります。 「ユーザーがいない」チェックには、ブール変数を使用できます。これをtrueに初期化し、ユーザーを印刷するときは常にfalseに設定します。このように、forループの後、変数がまだtrueの場合、ユーザーがいないことがわかります。これがあなたのコードに適用された私の2つのリビジョンです:ここでできる改善の1つは、拡張forループを使用することです。これにより、そのローカル変数を取り除くことができます
i
(これはまだ内部で使用されていますが、ここではパフォーマンスについては心配していません)そして配列要素のみを処理します。これが私の更新されたバージョンです:もう1つの改善点は、「ユーザーのリスト:」という見出しをユーザーがいる場合にのみ表示する場合です。あなたのコードを見ると、これはあなたが望むもののようです。これを実現するには、出力をすぐに印刷するのではなく、出力をバッファリングして後で印刷するだけです。 StringBuilderを使用して出力をバッファリングする場合、forループの後でStringBuilderが空であるかどうかを確認できるため、ブール変数が不要になります。これを実装する方法は次のとおりです。