2

このプロジェクトで助けが必要です。テスト コードを実行する方法が見つからないようです。テスト コードを変更することは許可されていません。IntegerSet クラスのみです。私はまだ学んでいます。これを理解するのを手伝ってください。

私はコードが長いことを知っているので、コメントの問題を配置しました! テストと現在のコードの 2 つのスポットの近くで、危険信号があるようです。多分 toString() が関係しているかもしれませんが、確かではありません。

現在のコード:

  public class IntegerSet {
  private int [] a;  // holds a set of numbers from 0 - 100

  public IntegerSet () {
    // an empty set, all a[i] are set to 0
    a = new int [101];
  }

  // A constructor that copies from an existing set.
  public IntegerSet (IntegerSet existingSet) {
    a = new int [101];
    for(int i=0; i<a.length; i++)
      a[i] = existingSet.a[i];
  }

  public void deleteElement(int i) {
    if ((i >= 0) && (i < a.length))
      a[i] = 0;  // set to 1
  }

  public void insertElement(int i) {
    if ((i >= 0) && (i < a.length))
      a[i] = 1;  // set to 1
  }

  public boolean isSet(int i) {
    return (a[i] == 1);
  }
  // PROBLEM!!!!

  // The union of this set and another set
  public IntegerSet union(IntegerSet otherSet) {
    IntegerSet newSet = new IntegerSet(this);

    // newSet is now a copy of the current set,  Next we
    // want to union with set a

    for(int i=0; i<a.length; i++) {
      if (otherSet.isSet(i))
        newSet.insertElement(i);
    }

    return newSet;
  }
  // PROBLEM!!!
  // The intersection of this set and another set
  public IntegerSet intersection(IntegerSet otherSet) {
    IntegerSet newSet = new IntegerSet(this);

    // newSet is now a copy of the current set,  Next we
    // want to intersect with set a

    for(int i=0; i<a.length; i++) {
      if (!otherSet.isSet(i))
        newSet.deleteElement(i);
    }

    return newSet;
  }


  // return true if the set has no elements
  public boolean isEmpty() {
    for (int i=0; i<a.length; i++)
      if (isSet(i)) return false;
    return true;
  }

  // return the 'length' of a set
  public int cardinality() {
    int count = 0;
    for (int i=0; i<a.length; i++)
      if (isSet(i))
        count++;
    return count;
  }

  // Print a set to System.out
  public void setPrint() {
    System.out.print("[Set:");

    if (isEmpty())
      System.out.print("---");

    for (int i=0; i<a.length; i++) {
      if (isSet(i))
        System.out.print(" " + i);
    }

    System.out.print("]\n");
  }

  // return true if two sets are equal
  public boolean isEqualTo(IntegerSet otherSet) {
    for(int i=0; i<a.length; i++) {
      if (otherSet.isSet(i) != isSet(i))
        return false;
    }
    return true;
  }

テストコード:

import java.util.Scanner;

public class IntegerSetTest {

    public static void main(String args[]) {

        IntegerSet setA = new IntegerSet();
        IntegerSet setB = new IntegerSet();

        Scanner scan = new Scanner(System.in);
        int input;

        do {            
            // Just for formatting purposes...
            System.out.println();            
            System.out.println("setA: " + setA);
            System.out.println("setB: " + setB);
            System.out.println("1) insertElement into setA");
            System.out.println("2) deleteElement from setA");
            System.out.println("3) insertElement into setB");
            System.out.println("4) deleteElement from setB");
            System.out.println("5) intersection of setA and setB");
            System.out.println("6) union of setA and setB");
            System.out.println("7) equality of setA and setB");
            System.out.println("Select from the menu above (or 0 to exit): ");
            input = scan.nextInt();

            switch(input) {
                case 1: 
                    System.out.print("Enter an element to insert into setA: ");
                    setA.insertElement(scan.nextInt());
                    break;
                case 2:
                    System.out.print("Enter an element to delete from setA: ");
                    setA.deleteElement(scan.nextInt());                  
                    break;
                case 3:    
                    System.out.print("Enter an element to insert into setB: ");
                    setB.insertElement(scan.nextInt());                 
                    break;
                case 4:
                    System.out.print("Enter an element to delete from setB: ");
                    setB.deleteElement(scan.nextInt());                  
                    break;
                case 5: // PROBLEM!   
                    System.out.println("The intersection of setA and setB is: " + IntegerSet.intersection(setA, setB));
                    break;
                case 6: // PROBLEM!
                    System.out.println("The union of setA and setB is: " + IntegerSet.union(setA, setB));
                    break;
                case 7:
                    System.out.println("setA and setB are " + (setA.isEqualTo(setB) ? "" : "un") + "equal");
                    break;
                default:
                    if (input != 0) {
                        System.out.println("\n*** Error, invalid input! ***\n");
                    }
            }          
        }while(input != 0);
    }

}
4

2 に答える 2

0

テストコードが実行されていることに気付くでしょう

IntegerSet.intersection(setA, setB)
IntegerSet.union(setA, setB)

とは対照的に

setA.intersection(setB)
setA.union(setB)

違いは、最初は静的メソッドの呼び出しであり、2番目はインスタンスメソッドの呼び出しであるということです。実装にはthis、2番目のパラメーターを受け入れる代わりに()を使用するインスタンスメソッドが含まれています。

(つまり、2番目のパラメーターの値に変更し、メソッドにキーワードをthis追加します。また、アクセサーメソッドを使用するには、プライベートへの参照を変更する必要があります。)statica

于 2012-12-04T04:53:14.643 に答える
0
 public static IntegerSet union(IntegerSet otherSet, IntegerSet nextSet) {

    for(int i=0; i<a.length; i++) {
      if (otherSet.isSet(i))
        nextSet.insertElement(i);
    }

    return nextSet;
  }

  public static IntegerSet intersection(IntegerSet otherSet, IntegerSet nextSet) {

    for(int i=0; i<a.length; i++) {
      if (!otherSet.isSet(i))
        nextSet.deleteElement(i);
    }

    return nextSet;
  }
于 2012-12-04T05:21:13.133 に答える