2012-02-07 5 views
2

У меня возникли трудности с пониманием моего задания, и я просто хочу убедиться, что я делаю это правильно и хотел бы получить еще пару глаз от моего кода. Мое назначение выглядит следующим образом:Выполнение класса Bag в Java/Использование массива

Внедрите класс Bag с использованием массива в качестве базовой структуры данных, которую я сделал. В нашей диаграмме UML мой инструктор показывает, что это массив объектов, и я смущен тем, как я должен делать это с объектами и как их сравнивать. Я создал класс Node для работы в качестве объектов и привяжу его к концу кода. Основная проблема заключается в том, что я не знаю, что делать для Союза и содержит и поэтому заставляет меня подвергать сомнению остальную часть моего кода.

public class Bag extends Node { 

    public Node array[]; 
    public Node header = new Node(null, null, null); 

    public int bagSize = 10000; // An Initial size of array for the Objects in 
    // the bag 

    public int MAX_SIZE = 1000000; // Max Size of elements in a undetermined 
    // size bag 

    static int count = 0; // Number of Elements currently in Bag 

    // Constructor for base Bag 
    // This bag has a maximum size 
    // bag that a bag can have 
    public Bag() { 
     array = new Node[MAX_SIZE]; 
     bagSize = MAX_SIZE; 
     array[count] = header; 

    } 

    // Constructor for bag of size 
    // which user can input 
    public Bag(int size) { 
     array = new Node[size]; 
     bagSize = size; 
     array[count] = header; 
    } 

    // Method which a user can add objects 
    // to the bag, the count will go up each 
    // time the method is called on the object. 
    public void add(Node newNode) { 
     int numOperations = 0; 
     Node n = new Node(); 
     numOperations++; 
     n = newNode; 
     numOperations++; 
     count++; 
     numOperations++; 
     array[count] = n; 
     numOperations++; 
     System.out.println("Operations = " + numOperations); 
    } 

    /** Remove a random Node from the bag **/ 
    public void removeRandom() { 

    } 

    /** Remove a specified Node from the bag **/ 
    public void remove(Node obj) { 
     int numOperations = 0; 
     int i; 
     numOperations++; 
     for (i = 0; i <= array.length - 1; i++) { 
      if (array[i] == obj) { 
       int pos = i; 
       numOperations++; 
       for (int j = i; j <= array.length - 1; j++) { 
        array[i] = array[i + 1]; 
        numOperations++; 
        if (i + 1 == array.length) 
         break; 
        numOperations++; 
       } 
       break; 
      } 
     } 

    } 

    /** Check is bag is empty **/ 
    public boolean isEmpty() { 
     System.out.println("Operations = 1"); 
     return (count == 0); 
    } 

    /** Check if bag contains the Node **/ 
    public boolean contains(String data) { 
     boolean contain = false; 
     if (!isEmpty()) { 
      for (int i = 0; i <= count; i++) { 
       if (data == array[i].data) { 
        return contain = true; 
       } else { 
        return contain = false; 
       } 
      } 
     } 
     return contain; 
    } 

    /** Return the size of bag **/ 
    public int size() { 
     return count; 
    } 

    /** Add all Nodes of bag a to the specified bag **/ 
    public static void addAll(Bag b, Bag a) { 
     int numOperations = 0; 
     if (b.bagSize >= a.size() + b.size()) { 
      numOperations++; 
      for (int i = 0; i <= a.size(); i++) { 
       b.add(b.array[i]); 
       numOperations++; 
      } 
     } 

    } 

    /** 
    * Join all elements of the two bags into a new bag but without any 
    * overlapping items. i.e No Duplicates 
    */ 
    public static Bag union(Bag a, Bag b) { 
     Bag bigger = new Bag(a.size() + b.size()); 
     if(!a.isEmpty() && !b.isEmpty() && a.equals(b)){ 
      for(int i=0;i<=bigger.bagSize;i++){ 
       if(a.contains(a.getData()) && b.contains(b.getData())){ 
        bigger.add(b.getNext());  
       }else{ 
        bigger.add(a.getNext()); 
        bigger.add(b.getNext()); 
       } 
      } 
     } 
     return b; 
    } 

    /** Determine if the bags equal each other in items **/ 
    public boolean equals(Bag a) { 
     if(bagSize == a.size()){ 

     } 
     return false; 
    } 
} 

public class Node { 
    String data; 
    Node prev,next; 

    public Node(Node next, Node prev, String data){ 
     this.next = next; 
     this.prev = prev; 
     this.data = data; 
    } 

    public Node(){ 

    } 

    public String getData() {return data;} 

    public Node getPrev() { return prev;} 

    public Node getNext() {return next;} 

    public void setData(String newName) {data = newName;} 

    public void setPrev(Node newPrev) { prev = newPrev; } 

    public void setNext(Node newNext) { next = newNext;} 

} 
+1

Что вы не понимаете в отношении методов сложения и объединения? Метод contains() проверяет, существует ли элемент в вашей сумке. Определение союза также довольно ясно (см. Википедию) (http://en.wikipedia.org/wiki/Union_ (set_theory))) – wonderb0lt

+1

Почему вы используете связанные узлы (и, таким образом, создаете какой-то связанный список) так как вас попросили использовать массив для хранения ваших объектов. Вам не нужен класс Node. И сумка, конечно же, не является узлом, поэтому он не должен расширять узел. –

+0

Теперь это имеет смысл, я только что закончил задание, работающее над LinkedLists, поэтому я был в этом менталитете, но теперь я понял, спасибо, и я знаю, что такое Union, но это меня просто сбивало с толку, так как я сочетал связанные списки в что я пытался сделать. Теперь он прояснился, поэтому мне должно быть хорошо идти. – sealsix

ответ

1

Вам не нужен Node класс, ваша сумка опирается на массив, создавая связанный список является излишним.

Ваш contains, кажется, находится на правильном пути (но еще нет), вероятно, он должен использовать equals() вместо ==. Однако вам нужно пересмотреть, как обрабатывается флаг contain.

В чем проблема с профсоюзом? Можете ли вы описать, как вы пытаетесь его реализовать (код не совсем ясен)?

+0

Спасибо, я использовал класс Node, потому что я был смущен тем, как добавлять объекты в свою сумку. Мы должны использовать объекты, а затем сравнивать и работать с данными внутри них, поэтому поэтому я использовал Nodes в первую очередь, но я это изменил. Что касается Союза, я просто смущен тем, как это следует делать. Мой инструктор сказал, что это должно быть сделано в два для циклов, но я не вижу, откуда это взялось. Наверное, мне просто сложно сравнивать данные, чтобы убедиться, что нет копий, а затем добавить их в новую сумку. – sealsix

+0

Ну, у вас уже есть метод 'contains()', похоже, что он может быть полезен здесь. И вы начинаете с двух мешков, поэтому, вероятно, вам нужны две петли. – Dmitri