2010-11-23 11 views
1

実行時に配列を通過して0.0のすべてのインスタンスを削除し、配列のサイズをゼロ以外の要素の数と同じに変更してそれらを配置するプログラムを作成しようとしています前の順序の要素。 1れる最初Javaは配列からゼロを取り除きます

0.0, 1.2, 0.0, 0.0, 0.0, 2.3, 0.0, 9.7, 5.6, 0.0 

、コードの実行後に内容が

n=4, a[0]=1.2, a[1]=2.3, a[2]=9.7, and a[3]=5.6. 

これでなければならない - それは、n場合= 10 [J]の内容、J = 0 Nには、ありますこれまで私が持っていたものです:

import java.util.Scanner; 
public class hw2 
{ 
    public static void main(String[] args) 
    { 
     Scanner scan = new Scanner(System.in); 
     final double KEY = 0.0; 
     int n = scan.nextInt(); 
     double[] a = new double[n]; 
     for(int i=0; i<n; i++) 
     { 
      a[i] = scan.nextDouble(); 
     } 
     for(int k = 0; k<n; k++) 
     { 
      if(a[k] == KEY) 
      { 
       a[k] = a[k+1]; 
       n--; 
      } 
      System.out.println(a[k]); 
     } 
    } 
} 

正しい方向にちょっとしたナッジがあります。

+0

*咳*考慮ArrayList *咳*この場合は、 、おそらく。 (また、 "使用された配列変数"をインクリメントしないでください。追加するときを除いて、 "非0"データの量を知っているか、反復中に最初に見つかった "0"を "有用なデータの終わり"として扱います。 ) –

+0

これは、double値を持つ配列aが既に存在し、既に充填された配列を通過し、0.0のすべてのインスタンスを削除するコードスニペットを実行する必要がある他の数字は同じ順番に保つ。 – Mike

答えて

1

あなたの実装(forループの第二)は適切ではない、それは簡単なテストケースに失敗します:> 5 2.0 2 0.0 3 0.0 入力はあなたのプログラムが間違った出力を持つことになります。 2.0 2.0 3.0 3.0

が、それはまた2.0 2.0 3

する必要があり、次の2つのダブルを比較するために==を使用することはできません。

次のコードは、現在のコードに基づか私のソリューションです:

public class hw21 { 
    public static void main(String[] args) { 
     Scanner scan = new Scanner(System.in); 
     final double KEY = 0.0; 
     final Double ACCEPTABLE_TOLERANCE = 0.000000000001d; 

     int n = scan.nextInt(); 
     double[] a = new double[n]; 
     for (int i = 0; i < n; i++) { 
      a[i] = scan.nextDouble(); 
     } 
     for (int k = 0, j = 0; k < n; k++) { 
      if (Math.abs(a[k] - KEY) < ACCEPTABLE_TOLERANCE) { 
       continue; 
      } 
      a[j] = a[k]; 
      System.out.println(a[j]); 
      j++; 
     } 
    } 
} 

はまた、私は以下のようにArrayListのを使用することを好む:

public class hw2 { 
public static void main(String[] args) { 
    Scanner scan = new Scanner(System.in); 
    final double KEY = 0.0; 
    final Double ACCEPTABLE_TOLERANCE = 0.000000000001d; 

    int n = scan.nextInt(); 
    double[] a = new double[n]; 
    for (int i = 0; i < n; i++) { 
     a[i] = scan.nextDouble(); 
    } 

    List<Double> newList = new ArrayList<Double>(); 
    for (int k = 0; k < n; k++) { 
     if (Math.abs(a[k] - KEY) < ACCEPTABLE_TOLERANCE) { 
      continue; 
     } 
     newList.add(a[k]); 
    } 

    System.out.println("There are " + newList.size() + " no-zero double:"); 
     System.out.println(newList); 
    } 
} 
2

ArrayListを使用することをお勧めします。必要に応じてアイテムを追加し、必要に応じて拡大し、正確な数を維持できます。

この場合、配列を使用したい/使用する必要がある場合は、値が「0」の場合は保存しないでください。 (また、 "使用された配列変数"をインクリメントしないでください。追加するときを除いて、 "非0"データの量を知っているか、反復中に最初に見つかった "0"を "有用なデータの終わり"として扱います。

ゼロを含む配列からゼロをまったく持たない配列に移動するには、2つのパスを使用する必要があります.1つはゼロ以外を数え、1つはゼロをカウントします適切なサイズの新しい配列を作成してから、ゼロ以外の値をコピーします。これは逆も可能です(最初の配列をコンパクトにしてから、その "塗りつぶした部分"をコピーします)が、少し複雑です。

あなたは(結果の配列はゼロを持っているであろうが、最後に)あなたの現在のアプローチを続けて行う場合は、あなたがインデックスポインタを維持する必要があります - 1は、一次ループイテレータで、第二はですゼロ以外の値を置く次の場所。値がコピーされるとき(または移動されないとき、両方のインデックスが同じときのように、最初の0に遭遇するまでの間に増分される)のみインクリメントされる。非ゼロを移動する場所を「ゼロ」にしてください。注文を保存する必要がない場合は、移動回数に減らすことができます。

1
import java.util.Arrays; 
import java.util.Scanner; 

public class StackOverflow1 
{ 
    public static final double KEY = 0.0; 
    private static final Scanner INPUT = new Scanner(System.in); 

    public static void main(String[] args) { 


     int length = INPUT.nextInt(); 
     double[] array = new double[length]; 

     for(int i=0; i<length; i++) { 
      array[i] = INPUT.nextDouble(); 
     } 

     int index = 0; 
     for(int k = 0; k < length ; k++) { 
      if(array[k] == KEY) { 
       continue; 
      } 
      array[index] = array[k]; // bring the non-zeroth element forward 
      if (index != k) array[k] = 0; //make the non-zeroth element zero in the actual location 
      index++; 
     } 
     System.out.println("n = " + index + " array = " + Arrays.toString(array)); 
    } 
} 
+0

私はこれが助けてくれることを願っています。さらに援助が必要な場合は、コメントを残してください。配列を縮小する場合は、新しい配列を作成し、この配列の要素を新しい配列にコピーする必要があります。または、リンクされたリストのようなデータ構造を使用する必要があります。その場合、問題はもっと解決しやすくなります – Ragavan

+0

最初から配列にそれらの不要なゼロを入れないといいですか? – asela38

+0

私はあなたが私が言ったことを理解してくれることを願っています。配列を縮小することはできません。その要素を別の配列に移動する必要があります。リンクされていないリストを使用する – Ragavan

0

これらの不要なゼロは次のように削除できますが、この場合はソートされます。

@org.junit.Test 
public void test15() throws Exception { 
    double[] arr = new double[]{0.0,1.1,0.1,0.0,2.1}; 
    double[] nonZeroArr = arr; 

    Arrays.sort(nonZeroArr); 
    int index = -1; 
    while((index = Arrays.binarySearch(nonZeroArr, 0.0)) > -1){ 
     double[] newArr = new double[nonZeroArr.length-index-1]; 
     System.arraycopy(nonZeroArr, index+1, newArr, 0, newArr.length); 
     nonZeroArr = newArr; 
    } 
    for (double d : arr) { 
     System.out.print(d +","); 
    } 
    System.out.println(); 
    for (double d : nonZeroArr) { 
     System.out.print(d + ","); 
    } 
} 
0

あなたはクラスのポイントに本当にスマート音にしたい場合は、これはJavaよりも生産性の高い多くの言語で1つのライナーです:

関連する問題