交集差异和相等的方法Java使用数组

时间:2015-10-24 04:02:16

标签: java

我试图写一些成员方法:

按如下方式创建类IntegerSet:类IntegerSet的每个对象可以保存0到100范围内的整数。一个集合在内部表示为1和0的数组。如果整数i在集合中,则数组元素a [i]为1。如果整数j不在集合中,则数组元素a [j]为0。例如,整数集{1,3,4,8,9}将在内部表示为:

{1, 3, 4, 8, 9}  = {0,1,0,1,1,0,0,0,0,1,1}

public IntegerSet intersection(IntegerSet)返回set,它是参数与此集合的集合理论交集,即

A ∩ B = { x | x ∈ A ∧ x ∈ B}

public IntegerSet difference(IntegerSet)返回set,它是参数和此集合的集合理论差异,即

A - B = {x | x∈A∧x∉B}

例如,如果A = {1,2,3}且B = {3,4,5}则A-B = {1,2}且B-A为{4,5}。 public boolean equals(IntegerSet)如果此set和参数集相同则返回true,否则返回false。

有人可以向我解释如何做到这一点。

我已经有一个联合集成员方法..这不能使用hashset bitset或任何高级的东西,因为我们还没有学到它们:..(

我已经完成了,但差异和相同的方法无法正常工作

到目前为止,这是我的代码......

  class IntegerSet{

   private int [] a = new int [100]; 

    public IntegerSet(){
  a = new int[100]; 
  }

   public void insert(int b){
   a[b] = 1; 

    }

   public void delete(int c){
     a[c] = 0; 
   }

 public String toString(){
    StringBuffer sb = new StringBuffer(); 

for(int i = 0; i < a.length; i++)
if(a[i] == 1)
    sb.append(i + " "); 

return sb.toString(); 

}


public IntegerSet union (IntegerSet d){
IntegerSet s = new IntegerSet(); 

for(int i = 0; i < a.length; i++)
    if(a[i] == 1|| d.a[i] == 1)
    s.insert(i); 
    return s; 
  }

public IntegerSet intersection(IntegerSet t){
IntegerSet s = new IntegerSet(); 

for(int i = 0; i < a.length; i++){
if(a[i] == 1 && t.a[i] == 1) 
s.insert(i); 
}
return s; 
  }

 public IntegerSet difference(IntegerSet p){

IntegerSet s = new IntegerSet(); 
    for(int i = 0; i < a.length; i++){
        if(a[i] == 1 && p.a[i] == 0)
        s.insert(i); 

    }
    return s; 
    }


    public boolean equals(IntegerSet l){
boolean b = false; 

for(int i = 0; i < a.length; i++)

    if(a[i] == l.a[i]) {  
     b = true; }

return b; 
   }
   }
      class Assignment1{
  public static void main(String [] args){
 IntegerSet n1 = new IntegerSet(); 


 n1.insert(7); 
 n1.insert(8); 
 n1.insert(3); 
 n1.insert(1); 
 n1.insert(4); 

    System.out.println("Integer Set: " +n1); 

IntegerSet n2 = new IntegerSet(); 
    n2.insert(3); 
    n2.insert(8); 
    n2.insert(2);
    n2.insert(5); 
    n2.insert(9); 


    System.out.println("Integer Set: " + n2); 

    n1.delete(7);
    n2.delete(2); 

    System.out.println("Integer Set: " + n1); 
    System.out.println("Integer Set: " +n2);


IntegerSet u = n1.union(n2); 
    System.out.println("Union: " + u); 

IntegerSet i = n1.intersection(n2); 
    System.out.println("Intersection: " + i);       

IntegerSet  d = n1.difference(n2); 
    System.out.println("Difference: " + d); 


 if (n1.equals(n2)); 
     System.out.println(n1 + "is equal to " + n2); 

      }

}

3 个答案:

答案 0 :(得分:1)

返回具有内部数组*a'*, where *a'* = *a* intersect *b* such that *a'*[i] = 1 iff *a*[i] == 1 AND *b*[i] == 1.

的新IntegerSet对象

答案 1 :(得分:0)

循环遍历数组并检查两者是否都设置为1。

HashSet set = new HashSet();
for(int i = 0; i < Math.min(a.length, b.length); ++i)
  if(a[i] && b[i] == 1)//check if both are one
    set.add(i + 1);
return set;

使用bitset

BitSet set = new BitSet();
for(int i = 0; i < Math.min(a.length, b.length); ++i)
  if(a[i] && b[i] == 1)//check if both are one
    set.flip(i);
return set;

如果你想用setter和getter创建自己的类:

public static class MySet
{
 int []arr;
 MySet(int n)
 {
   arr = new arr[n];
 }
 public void flip(i)
 {
  arr[i] = arr[i] == 1 ? 0 : 1;
 }
 public void get(i)
 {
   return arr[i];
 }
}

然后在Main类中使用此类。

public static void main(String[] arg)
{
 int a = {};
 int b = {};
 MySet s = new MySet(Math.min(a.length, b.length));

for(int i = 0; i < Math.min(a.length, b.length); ++i)
 if(a[i] && b[i] == 1)
  s.flip(i);
for(int i = 0; i < Math.min(a.length, b.length); ++i)
 if(s.get(i))
  System.out.println(i + 1);
}

答案 2 :(得分:0)

您不需要创建新类。 Java已经通过BitSet类提供了这个功能。

位集:http://docs.oracle.com/javase/7/docs/api/java/util/BitSet.html

您基本上是在尝试创建一个Bitset [由您的整数集表示],然后BitSet类提供您可以使用的AND / OR / XOR操作。