2016-11-01 12 views
-1

私が設定したパラメータに従って、正しいサイズの配列を作成するのに苦労しています。このプログラムでは、最初の配列の要素数が設定されています。これらの要素は次のとおりです。ある配列の特定の要素だけをJavaの別の配列にコピーする方法

int [] myWeights = {258, 58, 209, 91, 79, 182, 172, 27, 7, 29, 128, 198}; 

これらの要素はオンス単位です。私はすべてを正しく動かすプログラムを手に入れました。私の教授は、8ポンド以上のものを新しい配列に分割したいと考えています。この場合の新しい配列の要素は、258,209,182,172、および198です。問題は、最初のプログラムでは、1-320の間にさまざまなサイズの要素を持つランダムなサイズの配列を作成できることです。ある種のループを持って、適切な量の "ボックス"を必要とする方法がありますか?それとも、私はちょうど任意の数をインスタンス化して、私が必要とすることを願っていますか?このため私の現在のコードは、このいずれかをお問い合わせください不明確と思われる場合は、失礼なことする必要はありません

public static int [] overGivenPounds(int x, int [] array){ 
    int pounds = 0; 
    int arrayLength = 0; 
    int arrayOverEightPounds[]; 
    int k = 0; 
    for(int i = 0; i < array.length; i++){ 
     pounds = array[i]/16; 

     if(x < pounds){ 
      arrayOverEightPounds[k] = array[i]; 
      k++;   

     } 
    } 
    return arrayOverEightPounds; 

です。私はJavaにとって非常に新しいです。

答えて

2
  1. 先の配列のサイズ
  2. ことがなければ、ターゲット配列

に値を入れて第二のループを使用して、必要なサイズ

  • のターゲット配列を作成を決定するためにループを使用します最初のステップでは、配列の適切なサイズを知ることができません。 1つの要素が小さすぎる要素または2つの要素が1つ大きい配列を作成すると、正しいサイズの配列を返すために3番目の配列を作成することになるため、無駄になります。

    だからあなたのソリューションは、次のようになります。

    public static int[] overGivenPounds(int x, int[] array) { 
        int size = 0; 
    
        for (int value : array) { 
         if (satisfies(x, value)) { 
          size++; 
         } 
        } 
    
        int[] result = new int[size]; 
        // ??? -> for you to complete this 
        for (int value : array) { 
         if (satisfies(x, value)) { 
          // ??? -> for you to complete this 
         } 
        } 
    
        return result; 
    } 
    
  • 0

    どのように多くのトラックを維持しながら、それはあなたが、すべてのものを保持し、その配列にアイテムを追加することができます知っている配列を作成することです行うには、通常の方法あなたが追加したアイテム。最後に、配列のコピーを返し、項目の数に切り捨てます。

    または、Javaの8で、あなたはストリームワンライナーとしてそれを書くことができます。

    return Arrays.stream(array).filter(i -> (i/16) > x).toArray(); 
    
    0

    あなたは他のクラスを使用することを許可されていますか?その場合は、ArrayListを使用して、適切なサイズの配列を返すだけで、ArrayListを使用してから

    //int arrayOverEightPounds[]; 
    List<Integer> listOverEightPounds = new ArrayList<>(); 
    
    //... 
    
        //arrayOverEightPounds[k] = array[i]; 
        listOverEightPounds.add(array[i]); 
    
    //.... 
    
    return listOverEightPounds.toArray(new Integer[0]); 
    

    を返すことができます。この場合は、kを取り除くことができます。 ArrayListは内部的に配列を使用しますが、マイクロマネージメントを行う必要がないようにスペースが必要な場合は自動的にサイズを変更します。 ArrayListのtoArrayメソッドは、渡される配列のサイズが十分でない場合、適切なサイズの新しい配列を返します。あなたが見る共通のことは、サイズ0の配列をtoArrayに渡すことです。これは、返される値が常に正しいサイズの配列になることを意味します。

    +0

    これが見えるので、私は、そうは思いません私が探しているものとまったく同じです。私のコードや具体的な例を詳しく説明できますか?私はそれをやっているこれらの他の方法に慣れていない。 –

    +0

    私は「8ポンドを超えるものを新しい**配列**に分離したいと思っています。」 – mnoronha

    +1

    @DylanKelemen Edited。 –

    2

    Javaストリームを使用できますか?もしそうなら、解決策は次のようになります。

    return Arrays.stream(myWeights).filter(n -> n/16 > x).toArray(); 
    

    ないならば、あなたは正しい長さの配列を作成するためにArrays.copyOfを使用することができます。

    int[] heavyWeights = int[myWeights.length]; 
    int size = 0; 
    for (int weight: myWeights) 
        if (weight/16 > x) 
         heavyWeights[size++] = weight; 
    return Arrays.copyOf(heavyWeights, size); 
    
    2
    public static int[] overGivenPounds(int x, int[] array){   
        Arrays.sort(array); 
        boolean foundSomething = false; 
        int startIndex = 0; 
        for (int i = 0; i < array.length; i++) {   
         if(array[i]/16>=x){ 
          startIndex = i; 
          foundSomething = true; 
          break; 
         } 
        } 
        if(foundSomething) 
         return Arrays.copyOfRange(array, startIndex, array.length); 
        return null; 
    } 
    
    関連する問題