bugfix> java > 投稿

配列の中央にある要素の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 件
  • まず、コードがそのように動作するのはなぜですか?ループ内のコードは、ループのすべての反復で実行されます。したがって、そこにifステートメントがあり、ifステートメントの本体にreturnが含まれている場合、メソッドは、任意の反復でifステートメントがtrueになるとすぐに戻ります。

    次に、コードを修正します。特定の反復をスキップするには、 continue ステートメント。これにより、forループは次の反復に進みますが、ないメソッドから戻ります。 「ユーザーがいない」チェックには、ブール変数を使用できます。これをtrueに初期化し、ユーザーを印刷するときは常にfalseに設定します。このように、forループの後、変数がまだtrueの場合、ユーザーがいないことがわかります。これがあなたのコードに適用された私の2つのリビジョンです:

    public static void showUsers(){
        // declaring the boolean variable:
        boolean noUsers = true;
        System.out.println("List of Users:");
        // for loop loops over all the values of the array, not 100 times
        for (int i = 0; i < users.length; i++) {
            if (users[i] == 0) {
                // go to the next iteration
                continue;
            }
            // if we got this far, this element is not 0
            noUsers = false;
            System.out.println(users[i]);
        }
        //if noUsers is still true, we know there were no users other than 0's
        if (noUsers) {
            System.out.println("There's no users");
        }
    }
    
    

    ここでできる改善の1つは、拡張forループを使用することです。これにより、そのローカル変数を取り除くことができます i (これはまだ内部で使用されていますが、ここではパフォーマンスについては心配していません)そして配列要素のみを処理します。これが私の更新されたバージョンです:

    public static void showUsers(){
        boolean noUsers = true;
        System.out.println("List of Users:");
        // enhanced for loop is more concise and it covers up the i variable:
        for (int user : users) {
            if (user == 0) {
                continue;
            }
            noUsers = false;
            System.out.println(user);
        }
        if (noUsers) {
            System.out.println("There's no users");
        }
    }
    
    

    もう1つの改善点は、「ユーザーのリスト:」という見出しをユーザーがいる場合にのみ表示する場合です。あなたのコードを見ると、これはあなたが望むもののようです。これを実現するには、出力をすぐに印刷するのではなく、出力をバッファリングして後で印刷するだけです。 StringBuilderを使用して出力をバッファリングする場合、forループの後でStringBuilderが空であるかどうかを確認できるため、ブール変数が不要になります。これを実装する方法は次のとおりです。

    public static void showUsers(){
        // StringBuilder lets you build up a string without printing out
        // it is basically the same as a string, but it only performs the concatenation when
        // you tell it to
        StringBuilder output = new StringBuilder();
        for (int user : users) {
            if (user == 0) {
                continue;
            }
            // add the user to the StringBuilder instead of printing it out:
            output.append(user).append(System.lineSeparator());
        }
        if (output.length() == 0) {
            // if there are no users, the heading is not printed out
            System.out.println("There's no users");
        } else {
            System.out.println("List of Users:");
            // this causes an implicit call to the StringBuilder's toString() method,
            // which performs the concatenation and gives you a string you can print out
            System.out.println(output);
        }
    }
    
    

  • あなたは方法を使うことができます 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,
    
    

あなたの答え