0

インターフェイス NumList.java を実装し、NumLinkedList.java に実装されている LinkedList の ADT のテスト コードがあり、NumSet.java で使用しています。

私のNumSetには、二重配列入力からセットを作成し、intercept/unionおよびprintメソッドを使用してデータを使用および印刷できるメソッドがあるようにしようとしています。

しかし、私のテスト コードは、私のテスト NumSet 値、つまり testProof と testProof2 が空であることを示しています。

だから今、私のtestProofは空の変数を返しています。これは、何も保存されていないことを意味します。

static public NumSet intersect(NumSet S1, NumSet S2) //check 2nd for and if//
{
    NumSet intersectAnswer = new NumSet();

    for (int i = 0; i < S1.set.size()-1; i++)
    {
        for(int j = 0; j < S2.set.size()-1; j++)
        {
            double FUZZ = 0.0001;
            if (Math.abs(S1.set.lookup(i) - S2.set.lookup(j)) < FUZZ) // double values, this is more precise than ==.
                {
                    intersectAnswer.set.insert(1, S1.set.lookup(i));
                }
        }
    }

    return intersectAnswer;

}

は testProof のメソッドで、以下は testProof が定義されている場所です。

public static void main(String[] args)
{
    double[] a = {1.3,2,3,4,101.9};
    double[] b = {3,7,13,901,-29.1,0.05};

    NumArrayList test;
    test = new NumArrayList();
    test.printTest(); //runs test code in NumList


    //ok below is running. what is wrong with intersect?
    NumSet test2;
    test2 = new NumSet(a);
    NumSet test4;
    test4 = new NumSet(b);
    NumSet testProof;
    NumSet testProof2;

    test2.print(); //print out test 2
    System.out.println();
    test4.print();
    System.out.println();
    testProof = intersect(test2,test4);

として初期化しました

public class NumSet
{
private NumList set;

    public NumSet(double[] sth)
    {
        //moves elements of sth into set.
        set = new NumLinkedList();
        for(int i = 0; i < sth.length; i++)
        {
            set.insert(0,sth[i]);
        }
        set.removeDuplicates();
    }

    public NumSet()
    {
        set = new NumLinkedList();
    }

int numSet = 0;

私のインターセプト、ユニオン、プリントは以下のとおりです。

public NumSet intersect(NumSet S1, NumSet S2) //check 2nd for and if//
{
    NumSet intersectAnswer = new NumSet();

    for (int i = 0; i < S1.set.size()-1; i++)
    {
        for(int j = 0; j < S2.set.size()-1; j++)
        {
            if (S1.set.lookup(i) == S2.set.lookup(j))
                {
                intersectAnswer.set.insert(0, S1.set.lookup(i));
                }
        }
    }

    // intersectAnswer.set.removeDuplicates();  unnecessary, sets are already removed of duplicates
    return intersectAnswer;

}

public NumSet union(NumSet S1, NumSet S2)
{   //check logic.
    NumSet unionAnswer = new NumSet();

    for (int i = 1; i < S1.set.size()+1; i++)
    {
        unionAnswer.set.insert(1, S1.set.lookup(i));
    }

    for (int i = 1; i < S2.set.size()+1; i++)
    {
        unionAnswer.set.insert(1, S2.set.lookup(i)); 
    }
    unionAnswer.set.removeDuplicates();
    return unionAnswer;
}

public void print() 
{
    for (int i = 0; i < set.size()-1; i++)
    {
        System.out.print(set.lookup(i) + ",");

    }
    System.out.print(set.lookup(set.size()-1));
}

ルックアップとサイズは私の NumLinkedList.java から参照され、以下のとおりです

public int size() // measure size of list by counting counter++;
{


    return nItem; 
}


public double lookup(int i) 
{
    if( i <0 || i >= size()) //cannot lookup nonexistant object
    {
        System.out.println("out of bounds " + i + " < 0 or > " + size() );
        //how do I break out of this loop?
        System.out.println("just returning 0 for the sake of the program");

        return 0;
    }

    if(i == 0)
    {
        return head.value;
    }

    double answer = 0;
    Node currNode = head;
    for(int j = 0; j < i+1; j++) //move to ith node and save value
    {
        answer = currNode.value;    
        currNode = currNode.next;   
    }

    return answer;
}

最後に、私のテスト コードは以下のとおりです。ここで、testProof と testProof2 は次のとおりです。

public static void main(String[] args)
{
    double[] a = {1.3,2,3,4,101.9};
    double[] b = {3,7,13,901,-29.1,0.05};

    NumArrayList test;
    test = new NumArrayList();
    test.printTest(); //runs test code in NumList


    //ok below is running. what is wrong with intersect?
    NumSet test2;
    test2 = new NumSet(a);
    NumSet test4;
    test4 = new NumSet(b);
    NumSet testProof;
    NumSet testProof2;

    test2.print();
    System.out.println();
    testProof = test2.intersect(test2, test4);
    System.out.println("tried intersect");
    testProof.print(); 
    System.out.println();
    System.out.println("tried test.print()");
    testProof2 = test2.union(test2,test4);
    System.out.println("tried union");
    testProof2.print(); 
    System.out.println();
    System.out.println("NumSet ran fully.");
4

1 に答える 1

0

2 つの double 値を比較すると、このデバッグ段階でコードが不要に複雑になる傾向があるため、デバッグ中にdouble 値ではなく整数値を使用して NumSet クラスを実装することをお勧めします。

removeDuplicates() メソッドを見たいと思うかもしれませんが、それがあなたの問題に対する答えを保持していると思います。残念ながら、投稿したコード内には表示されません。

実際には、 intersect() メソッド内のコードのこの部分は、最初から失敗する運命にあります。

if (S1.set.lookup(i) == S2.set.lookup(j))

double を使用しているため、== は 2 つの異なる値を比較する非常に不正確な方法です。より良い方法は、ある程度の精度誤差を許容することです。

double final FUZZ = 0.0001
if (Math.abs(S1.set.lookup(i) - S2.set.lookup(j)) < FUZZ )
    //...
于 2012-09-29T00:33:15.883 に答える