2017-02-26 1 views
-2

私は2つのスポットを持つ配列を持っています(最初は2つのスポットが必要です)。私はユーザーの入力を取得し、ユーザーが配列を保持できる以上のものを入力すると、配列を倍増する必要があります。また、-1を入力すると、ユーザー入力が停止するはずです。配列は重複を受け入れてはならない。配列の操作方法は?

私は、重複を受け入れないようにして、ユーザーが-1を入力したときにプログラムを終了させる方法を知らないうちに、いっぱいになるたびに配列を倍増させます。

これまで私がこれまでに持っていたことは、その欠陥があり、正しく実行されていないことです。

public class GroupArrays { 

public static void main(String[] args) { 

Scanner input = new Scanner (System.in); 
int [] numbers = new int[2]; 
int x; 
int n=0; 



    for(int i = 0; i<numbers.length; i++){ 
     System.out.println("Please enter number"); 
     int number = input.nextInt(); 

     while (input.hasNextInt()) 
     { 
      x = input.nextInt(); 


      if (n == numbers.length) 
      { 

       int[] h; 
       h = new int[ 2*numbers.length ]; 

       for (int i1 = 0; i1 < numbers.length; i1++) 
       h[i1] = numbers[i1];    

       numbers = h;  

      } 
      if(x == -1){ 
       break; 
      } 

      numbers[n] = x; 
      n++;   
     } 

     for (int i1 = 0; i1 < numbers.length; i1++) 
       System.out.println(numbers[i1]); 
      } 
      } 

私は個別にすべてのことを行う方法を見つけ出すことができますが、私は1つのアレイにそれらすべてを行うと、ユーザーの入力を行う必要があるとき、それが困難になります。 PS。私はこれをもっと複雑にするような気がする。

答えて

0

私は、問題を解決するためのヒントや、理解しやすく維持しやすいコードを書く方法について、自分でも(そして最も重要なのは)

単純なタスクを実行して、メソッド内でコードを分割します。すべてを大規模なコードとして書き込もうとしないでください。

  • 尋ねると入力番号
  • を取得:

    アルゴリズムの擬似コードを使用すると、簡単に別のメソッドとして実装することが可能なものがあることがわかります、今

    loop 
        ask and get input number 
    
        if (number is -1) 
         break out of the loop 
    
        else if array already contains number 
         print error message 
    
        else 
    
         if no space left in array 
          array = copy of array with doubled length 
    
         store number in next available index in array and increment the next available spot index 
    end of loop 
    
    print the array 
    

    だろう

  • 配列にすでに数値が含まれているかどうかを確認する
  • 倍の長さの配列のコピー
  • 配列を印刷する

まず、これらの単純なメソッドのシグネチャを実装せずに記述します。次に、これらのメソッドを呼び出してアルゴリズムを記述します。

次に、簡単な方法を1つずつ実装し、1つずつテストします。今のところ、ハードコードされた引数でそれらを呼び出すメインメソッドを記述し、それらがあなたが期待することをするかどうかを確認するだけで、これを行うことができます。

これらのすべてが書き込まれてテストされたら、メインアルゴリズムをテストします。間違えた場合は、修正しなければならないメソッドを再テストして繰り返します。

すべてのメソッドをコーディングしながら、変数が何を表しているかを明確に示す名前と、メソッドが何をしているかを明示的に示します。たとえば、nextAvailableIndexは、xよりずっとはっきりしています。良い名前を使用すると、あなたを含むすべての人が、コードを理解してバグを見つけるのに役立ちます。

また、厳密に入力するとコードをインデントします。投稿したコードが正しくインデントされていないため、その構造を理解することが難しくなります。あなたのifforなどの身体の周りには、常にインデントレベルとして4つのスペースに固執し、中かっこを使用してください。次の行ではなく、if/forの後ろに置いてください。一貫してください。

+0

ありがとうございました。私は最初に紙にpsudocodingを開始する必要があります。私はタイプとして私はそれを把握するのに問題があり、通常私は間違っています。 –

+0

そのため、小さくてシンプルな部分に分割することが非常に重要です。これらは、grok、実装、テストするのが簡単です。あなたがうんざりしてしまった場合は、変更するのが簡単です。良い単純なビルディングブロックがあれば、それらを組み立てるのがより簡単になります。 –

-1
public class GroupArrays { 

public static void main(String[] args) { 

Scanner input = new Scanner (System.in); 
int [] numbers = new int[2]; 
int x; 
int n=0; 



for(int i = 0; i<numbers.length; i++){ 
    System.out.println("Please enter number"); 
    int number = input.nextInt(); 

    while (input.hasNextInt()) 
    { 
     x = input.nextInt(); 


     if (n == numbers.length) 
     { 

      int[] h; 
      h = Arrays.copyOf[numbers,2*numbers.length ]; //change  

     } 
     if(x == -1){ 
      break; 
     } 

     numbers[n] = x; 
     n++;   
    } 

    for (int i1 = 0; i1 < numbers.length; i1++) 
      System.out.println(numbers[i1]); 
     } 
     } 

可変長の新しい配列を作成するには、Arrays.copyOf(array_name,array_length);を使用します。