2017-05-21 8 views
0

配列内の隣接する要素の束を数えるにはいくつかの助けが必要です。配列内の要素の束Java

私は4つの整数配列を持っていると言います。

myArray = {1, 1, 1, 1} 
myArray2 = {5, 6, 7, 8, 7, 1, 10, 11, 12}; 
myArray3 = {5, 6, 7, 7, 8, 1, 10, 11, 12}; 
myArray4 = {5, 6, 7, 7, 8, 1, 10, 11, 11, 11, 12}; 

これらの配列の要素数を計算します。

所望の出力は次のようになります。

myArray => 1 (1 bunch of adjacent element "1") 
myArray2 => 0 (no adjacent element) 
myArray3 => 1 (1 bunch of adjacent element "7") 
myArray4 => 2 (2 bunches of adjacent elements "7" and "11") 

私は隣接する要素ではなく、房をカウントすることができます。

は、ここで私が書いたコードです:私は宿題をしたくない

import acm.program.ConsoleProgram; 

public class project extends ConsoleProgram{ 
    public void run() 
    { 
     int[] myArray = {1, 1, 1, 1}; 
     int[] myArray2 = {5, 6, 7, 8, 7, 1, 10, 11, 12}; 
     int[] myArray3 = {5, 6, 7, 7, 8, 1, 10, 11, 12}; 
     int[] myArray4 = {5, 6, 7, 7, 8, 1, 10, 11, 11, 11, 12};   

     println("myArray -> " + countBunches(myArray)); 
     println("myArray2 -> " + countBunches(myArray2)); 
     println("myArray3 -> " + countBunches(myArray3)); 
    } 

    public int countBunches(int[] myArray) 
    { 
     int count = 0; 
     int saveIndex; 
     int saveContent; 

     for(int i = 0; i<myArray.length; i++) 
     { 
      if(i == 0) 
      { 
       saveContent = myArray[i]; 
      } 
      else 
      { 
       saveContent = myArray[i-1]; 
       if(saveContent == myArray[i]) 
       { 

        saveContent = myArray[i]; 
        saveIndex = i; 
        count++; 
        println(myArray[saveIndex] + " repatingb" + saveIndex + ". element"); 
       } 
       else 
       { 
        saveContent = myArray[i]; 
       } 
      } 
     } 

     return(count); 
    } 
} 
+1

申し訳ありませんが、「したいですが」は質問ではなくコード要件です。あなたの質問を編集し、あなたのコードを書くのを止めている特定の問題の説明を記入してください。また、あなたの試行を含めて、他の人があなたを助けるよう促すかもしれません。 – Pshemo

+0

@Pshemo私は私の試みを加えました。 "私は欲しい"と申し訳ありません。 –

+0

@freedev私は今日以来試みてきました。そして、SOはその問題に関する私の最新のステーションです。 –

答えて

1

問題は、要素が最後のものと一致するたびにカウントされていることです。あなたが行の同じ項目の3を持っているのであれば、それは2としてカウントし、代わりの1

一つの方法は、最後の項目を追跡し、それが一致したかどうかをすることです:

public int countBunches(int[] myArray) 
{ 
    int count = 0; 
    int lastItem; 
    boolean lastItemMatched; 

    for(int i = 0; i<myArray.length; i++) 
    { 
     if(i == 0) 
     { 
      lastItem = myArray[0]; 
      lastItemMatched = false; 
     } 
     else 
     { 
      if(lastItem == myArray[i]) 
      { 
       if(!lastItemMatched) 
       { 
        count++; 
       } 

       lastItemMatched = true; 
      } else { 
       lastItemMatched = false; 
      } 

      lastItem = myArray[i]; 
     } 
    } 

    return count; 
} 
この方法では

private static int countBunches(int[] numbers){ 
    Integer previous = null; 
    int bunch = 0; 
    for (int i = 0; i < numbers.length; i++){ 
     if (previous!=null){ 
      if (previous==numbers[i]){ 
       bunch++; 
       while (i < numbers.length && previous==numbers[i++]){} 
      } 
     } 
     if (i < numbers.length){ 
      previous = numbers[i]; 
     } 
    } 
    return bunch; 
} 

我々は(私は、整数を使用して、以前の数があったかどうかを判断できるようにするには、ヌルに依存する理由です)前の数を追跡する:

+0

恐ろしい、私はこれをどう考えてもらえませんでした。ありがとう@ジェイソン –

1

が、見てみましょう。

どのようなアプローチですか?

  • あなたはたくさんの数を持って、そして配列
  • を歩くどちらの束は、現在の要素が前の要素であるならば、それはどうかまだたくさんかによって異なり
  • 進行中かどうかがあります。

これは多かれ少なかれあなたのアプローチです。

また、バンチの開始(内側のループ)であるかどうかをチェックし、バンチ後にiを設定することもできます。

使用明確な変数:

public int countBunches(int[] numbers) 
+0

あなたのeffordありがとう、@ジェイソンのソリューションははるかに適用されます。 –

0
ここ

は素敵な簡単な方法です。

1つのトリックは、内側ループ内の等しい数のシーケンス全体を調べることです。

+0

あなたのソリューション@Davidありがとうございました。これはより実用的に見えます。 –

+0

素晴らしいです、ありがとうございます。投票して答えとして受け入れることを忘れないでください –

関連する問題