Csharp/C Sharp/Collections Data Structure/Set

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

Put the Set class into its own namespace

/*
C# A Beginner"s Guide
By Schildt
Publisher: Osborne McGraw-Hill
ISBN: 0072133295
*/
using System;  
using MyTypes.Set;
/*  
   Project 12-1  
  
   Put the Set class into its own namespace. 
*/  
namespace MyTypes.Set { 
   
  class Set {     
    char[] members; // this array holds the set     
    int len; // number of members  
  
    // Construct a null set.  
    public Set() {  
      len = 0;  
    }  
  
    // Construct an empty set of a given size.    
    public Set(int size) {     
      members = new char[size]; // allocate memory for set     
      len = 0; // no members when constructed  
    }     
    
    // Construct a set from another set.  
    public Set(Set s) {     
      members = new char[s.len]; // allocate memory for set     
      for(int i=0; i < s.len; i++) members[i] = s[i];  
      len = s.len; // number of members  
    }     
  
    // Implement read-only Length property.  
    public int Length {  
      get{  
        return len;  
      }  
    }  
  
    // Implement read-only indexer.  
    public char this[int idx]{  
      get {  
        if(idx >= 0 & idx < len) return members[idx];  
        else return (char)0;  
      }  
    }  
  
    /* See if an element is in the set.     
       Return the index of the element  
       or -1 if not found. */  
    int find(char ch) {  
      int i;  
      
      for(i=0; i < len; i++)  
        if(members[i] == ch) return i;  
  
      return -1;  
    }  
  
    // Add a unique element to a set.     
    public static Set operator +(Set ob, char ch) {   
      Set newset = new Set(ob.len + 1); // make a new set one element larger  
  
      // copy elements  
      for(int i=0; i < ob.len; i++)  
        newset.members[i] = ob.members[i];  
  
      // set len  
      newset.len = ob.len;  
     
      // see if element already exists  
      if(ob.find(ch) == -1) { // if not found, then add  
        // add new element to new set  
        newset.members[newset.len] = ch;  
        newset.len++;  
      }  
      return newset; // return updated set  
    }     
  
    // Remove an element from the set.     
    public static Set operator -(Set ob, char ch) {   
      Set newset = new Set();   
      int i = ob.find(ch); // i will be -1 if element not found  
  
      // copy and compress the remaining elements  
      for(int j=0; j < ob.len; j++)  
        if(j != i) newset = newset + ob.members[j];  
  
      return newset;  
    }     
  
    // Set union.  
    public static Set operator +(Set ob1, Set ob2) {   
      Set newset = new Set(ob1); // copy the first set  
  
      // add unique elements from second set  
      for(int i=0; i < ob2.len; i++)   
          newset = newset + ob2[i];  
  
      return newset; // return updated set  
    }  
  
    // Set difference.  
    public static Set operator -(Set ob1, Set ob2) {   
      Set newset = new Set(ob1); // copy the first set  
  
      // subtract elements from second set  
      for(int i=0; i < ob2.len; i++)   
        newset = newset - ob2[i];  
  
      return newset; // return updated set  
    }  
  }     
}
  
  
// Demonstrate the Set class.    
public class SetDemo10 {    
  public static void Main() {    
    // construct 10-element empty Set   
    Set s1 = new Set();    
    Set s2 = new Set(); 
    Set s3 = new Set(); 
 
    s1 = s1 + "A"; 
    s1 = s1 + "B"; 
    s1 = s1 + "C"; 
 
    Console.Write("s1 after adding A B C: ");  
    for(int i=0; i<s1.Length; i++)     
      Console.Write(s1[i] + " ");    
    Console.WriteLine(); 
 
    s1 = s1 - "B"; 
    Console.Write("s1 after s1 = s1 - "B": ");  
    for(int i=0; i<s1.Length; i++)     
      Console.Write(s1[i] + " ");    
    Console.WriteLine(); 
 
    s1 = s1 - "A"; 
    Console.Write("s1 after s1 = s1 - "A": ");  
    for(int i=0; i<s1.Length; i++)     
      Console.Write(s1[i] + " ");    
    Console.WriteLine(); 
 
    s1 = s1 - "C"; 
    Console.Write("s1 after a1 = s1 - "C": ");  
    for(int i=0; i<s1.Length; i++)     
      Console.Write(s1[i] + " ");    
    Console.WriteLine("\n"); 
 
    s1 = s1 + "A"; 
    s1 = s1 + "B"; 
    s1 = s1 + "C"; 
    Console.Write("s1 after adding A B C: ");  
    for(int i=0; i<s1.Length; i++)     
      Console.Write(s1[i] + " ");    
    Console.WriteLine(); 
 
 
    s2 = s2 + "A"; 
    s2 = s2 + "X"; 
    s2 = s2 + "W"; 
 
    Console.Write("s2 after adding A X W: ");  
    for(int i=0; i<s2.Length; i++)     
      Console.Write(s2[i] + " ");    
    Console.WriteLine(); 
 
    s3 = s1 + s2; 
    Console.Write("s3 after s3 = s1 + s2: ");  
    for(int i=0; i<s3.Length; i++)     
      Console.Write(s3[i] + " ");    
    Console.WriteLine(); 
 
    s3 = s3 - s1; 
    Console.Write("s3 after s3 - s1: ");  
    for(int i=0; i<s3.Length; i++)     
      Console.Write(s3[i] + " ");    
    Console.WriteLine("\n"); 
 
    s2 = s2 - s2; // clear s2 
    s2 = s2 + "C"; // add ABC in reverse order 
    s2 = s2 + "B"; 
    s2 = s2 + "A"; 
 
    Console.Write("s1 is now: ");  
    for(int i=0; i<s1.Length; i++)     
      Console.Write(s1[i] + " ");    
    Console.WriteLine(); 
 
    Console.Write("s2 is now: ");  
    for(int i=0; i<s2.Length; i++)     
      Console.Write(s2[i] + " ");    
    Console.WriteLine(); 
 
    Console.Write("s3 is now: ");  
    for(int i=0; i<s3.Length; i++)     
      Console.Write(s3[i] + " ");    
    Console.WriteLine(); 
  }    
}