Устанавливает использование битовых строк в проблемах Java - PullRequest
1 голос
/ 14 января 2012
public class BitStringOperations3
{

public static void main (String args[])
 {
  Scanner in = new Scanner (System.in);

  int setA = 0;
  int setB = 0;
  int elementsSetA = 0;
  int elementsSetB = 0;


  System.out.println ("How many integers are in set A?");
  elementsSetA = in.nextInt ();
    while (elementsSetA > 9 || elementsSetA < 0)
      {
       System.out.println ("This input is invalid. Please enter a number between 0 and 9 and try again.");
        elementsSetA = in.nextInt();
      }



  System.out.println ("How many integers are in set B?");
  elementsSetB = in.nextInt ();
    while (elementsSetB > 9 || elementsSetB < 0)
      {
       System.out.println ("This input is invalid. Please enter a number between 0 and 9 and try again.");
        elementsSetB = in.nextInt();
      }




    for (int i = 1; i <= elementsSetA; i++)
     {
      System.out.println ("Please enter integer number " + i + " in set A: ");
       setA = add(setA, in.nextInt() );
     }

     for (int i = 1; i <= elementsSetB; i++)
      {
       System.out.println ("Please enter integer number " + i + " in set B: ");
        setB = add(setB, in.nextInt () );
      }








 }


 public static boolean setContainsValue (int set, int value)
 {
boolean setContainsValue = (set & maskForValue) != 0;
return true;
 }


 public static int addValueToSet (int set, int newValue)
 {
 set = set | maskForValue;
 return set;
 }

 public static void printSet (int set, int value)
{
 int mask = 1;
 System.out.print ("{");
  for (int i = 0; i<= 9; i++)
  {
    if(( mask & set ) == 1)
     System.out.print(i + " " );
        int maskForValue = 1 << value;
        set >>= 1; //set = (set >> 1);

  }

  System.out.println ("} ");


}







  }

У меня проблемы с заданием для школы.Нам дано универсальное множество U = {0-9}.Я должен собрать пользовательский ввод для обоих наборов, а затем использовать битовые строки (нам не разрешено использовать классы Set или HashSet в java) для хранения наборов и выполнения над ними операций, таких как дополнение, объединение Set A, набор B инапример.Я знаю, как это сделать, но мой код не преобразует наборы A и B в память правильно, и поэтому я не могу выполнять над ними какие-либо операции.Помощь будет с благодарностью!Заранее спасибо.:)

Редактировать 1:

Хорошо, я прочитал ваши идеи и постарался реализовать их как можно лучше, и я дал результат выше.Эта программа действительно выталкивает меня из моей зоны комфорта, и я действительно ценю всю помощь.

Ответы [ 2 ]

4 голосов
/ 14 января 2012

Прежде всего, сделайте себе одолжение и создайте вспомогательные методы.Затем сконцентрируйтесь только на том, чтобы сделать их правильными:

public static boolean contains(int set, int value) {
   //return true if value bit is 1 in set
}

public static int add(int set, int newValue) {
   //add newValue to set and return it
}

После этого вы сможете выразить свою логику более четко:

if ( contains(set, 1) ) {
   //print 1
}

Некоторые общие советы:

  • Не используйте Math.pow(), поскольку это сделано для чисел с плавающей точкой.Чтобы получить степень 2 как целое число, используйте сдвиг битов:

    int maskForValue = 1 << value;
    
  • Чтобы проверить, установлен ли определенный бит, найдите маску для этого бита и используйте &.Это обнуляет все биты, за исключением проверяемого вами бита.

    boolean setContainsValue = (set & maskForValue) != 0;
    
  • Чтобы установить бит в поле битов, найдите маску для этого бита и используйте |.Это гарантирует, что этот бит станет 1.

    set = set | maskForValue;
    

Edit

Что касается вашей прямой проблемы, взгляните на это:

  for (int i = 1; i <= elementsSetB; i++)
  {
     System.out.println ("Please enter integer number " + i + " in set B: ");
     setB = in.nextInt ();
  }

Вы каждый раз перезаписываете setA и setB.В конце, setA и setB будут содержать последнее значение, указанное пользователем.Затем, позже, вы делаете это:

  for (int i = 0; i <=9; i++)
     setB |= (int)pow(2.0, i-1);

, который просто игнорирует вводимые пользователем данные и перезаписывает все биты 0-9 (хотя небезопасно!).Поэтому, конечно, то, что вводит пользователь, не имеет значения.

Избавьтесь от последнего для циклов и затем сохраните входные данные следующим образом (используя вспомогательные методы, которые я описал выше):

  for (int i = 1; i <= elementsSetB; i++)
  {
     System.out.println ("Please enter integer number " + i + " in set B: ");
     setB = add(setB, in.nextInt());
  }

Править2

У вас, похоже, проблемы с пониманием того, откуда я пришел, с моим представлением об этих "вспомогательных" методах.Если вы впервые работали с методами, имеющими параметры, извините за помутнение проблемы.Но они позволяют вам сосредоточиться на том, чтобы заставить работать одновременно один функционал.Я более подробно остановлюсь здесь на том, что я имею в виду:

public static boolean setContainsValue(int set, int value) {
   //return true if the bit string (or bit set) represented by the "set" parameter
   //contains the value stored in the "value" parameter
   //see the FIRST and SECOND bullet points above for how to do this
}

public static int addValueToSet(int originalSet, int valueToAdd) {
   //add the value stored in the "valueToAdd" parameter to the set represented by the
   //"originalSet" parameter and return the result
   //see the FIRST and THIRD bullet points above for how to do this.
}

Я даже напишу несколько тестов для вас.Методы, описанные выше, не были реализованы должным образом до тех пор, пока по крайней мере все перечисленные ниже значения не будут напечатаны:

int set = 0;

System.out.println( ! contains(set, 1) ); //make sure set doesn't contain 1

set = addValueToSet(set, 1);
System.out.println( contains(set, 1) ); //make sure set now contains 1
System.out.println( !contains(set, 2) ); //make sure set doesn't contain 2

set = addValueToSet(set, 2);
System.out.println( contains(set, 1) ); //make sure set still contains 1
System.out.println( contains(set, 2) ); //make sure set now contains 2
0 голосов
/ 14 января 2012

Во-первых, вам нужен класс (это объектно-ориентированное программирование, верно?), Содержащий "DigitSet".

public DigitSet {

   private BitSet digits;

   public DigitSet() {
     // digits contains one bit for each digit
     digits = new BitSet(10);
   }

   ... rest of DigitSet code goes here, like ...
   /**
    * Check if this set contains a particular digit.
    */
   public boolean contains(int value) {
     // check to see if value is a valid input (0-9)
     // look in digits to see if the "right" bit is set.
   }

   public void set(int value) {
     // check to see if value is a valid input (0-9)
     // set the "right" bit in digits to 1.
   }

   public void clear(int value) {
     // check to see if value is a valid input (0-9)
     // set the "right" bit in digits to 0.         
   }

   public DigitSet union(DigitSet other) {
     // construct a "new" output DigitSet.
     // Walk through all of the digits in "this" set
       // if a digit is set in this set, set it in the output set.
     // Walk through all of the digits in the "other" set
       // if a digit is set in the other set, set it in the output set.
   }

   public String toString() {
     // return a display string based on the set "digit" bits
   }

}

Тогда все остальное - просто обработка ввода и «выполнение операции»

public static void main(String[] args) {
  DigitSet first = new DigitSet();
  // read in the values for the first digit set, for each value
    // set the digit in first like so
    first.set(value);
  DigitSet second = new DigitSet();
  // read in the values for the second digit set, for each value
    second.set(value);

  DigitSet result = first.union(second);
  System.out.println("Result: " + result.toString());

}
...