2012-01-28 3 views
2

int型の配列を指定すると、次のことを行うメソッドを記述したいと思います。配列要素の各ペアに対して、それらを結合して内部クラスオブジェクトのリストに入れます。次に、配列の各要素を比較し、各ペアの値の間に収まるかどうかを確認します。 (つまり、配列0,4,4のペア(0,4)を作成した後、値2が実際に0と4の間にあるかどうかをチェックするので、カウンタが増加します)。私は次のコードを試しましたが、0を返しました。それを修正する方法、またはそれを達成するための簡単な方法はありますか?私は主に戻り値が正しいことを心配しています。ありがとうございます与えられた配列の2つの要素の間にある配列要素の数を数える方法

import java.util.*; 
import java.util.Map; 
import java.lang.*; 

public class Prac1 { 
    public int count(int[] A){ 
     int k = 0; 
     class PTemp{   
      int first = -1; 
      int second = -1; 
      public PTemp(int first, int second){ 
       int f = first; 
       int s = second;    
      }   
     } 
     List<PTemp> r = new ArrayList<PTemp>(); 
     for (int i = 0; i < A.length; i++) { 
       for (int j = i+1; j < A.length; j++) { 
        r.add(new PTemp(A[i], A[j])); 
        r.add(new PTemp(A[j], A[i])); 
        //System.out.println("["+A[i] +","+A[j]+"]"); 
        //System.out.println("["+A[j] +","+A[i]+"]"); 
       } 
      } 
     Iterator<PTemp> ir = r.iterator(); 
     while (ir.hasNext()){ 
      PTemp p = ir.next(); 
      for (int i = 0; i < A.length; i++){ 
       if (((p.first < A[i]) && (A[i] < p.second)) || ((p.first > A[i]) && (A[i] > p.second))){ 
        k = k + 1; 
       } 
      }  
     }    
     return k; 
    } 
    public static void main(String[] args){ 
     int[] A = {0, 2, 4}; 
     Prac1 pr = new Prac1(); 
     System.out.println(pr.count(A)); 
    } 
} 
+0

なぜあなたは '' PTEMP(J、I) 'だけでなく' PTEMP(i、j)を追加していますか? –

+0

彼は同じ配列の別の値のペアの間にある配列の値の数を探したいので、両方が必要です。 –

+0

同じ値の値は[0,2]と[2,0]の間にあるため、両方を必要としません。 –

答えて

4

class PTemp{   
     int first = -1; 
     int second = -1; 
     public PTemp(int first, int second){ 
      int f = first; 
      int s = second;    
     }   
    } 

は本当にする必要があります:

class PTemp{   
     int first = -1; 
     int second = -1; 
     public PTemp(int first, int second){ 
      this.first = first; 
      this.second = second;    
     }   
    } 

今すぐフィールドが正しく設定されています。

+0

これは私の以前のバージョンがそれは好きですが、何らかの理由でそれを取り除いています(笑それは近いです)。ありがとう、あなたの担当者を助けるでしょう – aretai

2

私はバグを見ました。この:

r.add(new PTemp(i, j)); 
r.add(new PTemp(j, i)); 

は次のようになります。

r.add(new PTemp(A[i], A[j])); 
r.add(new PTemp(A[j], A[i])); 

EDIT:他のポスターは、別のバグを発見したように見えます。私はあなたのコードが今働いていることをうれしく思っていますが、非常に大きな配列で使用すると非常に遅くなります。非常にです。私はあなたの他の、関連する質問への答えとして、巨大な配列であっても、それを速くする方法を投稿しました。アレックス・Dで述べたものに加えて第2のバグが見つかりました

+0

ありがとうございます。 )。今のところ私はそれを達成したいと思っていますが、非常に大きな配列でも使用できます。計算上の問題が疑わしいですか? – aretai

+0

それは面白いです、私はそれを実装しようとします。私はあなたの担当者を上げます。もしあなたが望むなら、最終版の最適化を手伝ってください。http:// stackoverflow。com/questions/9048983/how-to-optimize-query-on-how-to-count-number-of-array-elements-that-dont-have-v – aretai

2

問題はここにある:私は、エラーをマークし、あなたはint fを設定し、firstsecondに等しいint sラインで

class PTemp 
{   
    int first = -1; 
    int second = -1; 
    public PTemp(int first, int second) 
    { 
     int f = first; //error 
     int s = second; //error  
    }   
} 

、これに伴う問題は、あなたのクラスPTempの属性がfirstと呼ばれているということですsecondは、fおよびsではありません。

これに変更をして、もう一度試してください:

 class PTemp 
    {   
     int first = -1; 
     int second = -1; 

     public PTemp(int first, int second) 
     { 
      this.first = first; 
      this.second = second;    
     }   
    } 
+0

ああ、それは最初に得た正しい燃焼です;) – aretai

+0

彼のポストを参照してください –

関連する問題