читать из файла, а затем создавать объекты частного класса - PullRequest
0 голосов
/ 20 октября 2019

У меня есть закрытый узел класса внутри публичного класса singlyLinkedList, и я хочу перемещаться по списку (как временный) из другого общедоступного класса, так как я могу создать временный узел или (метод) для перемещения по списку. и я не могу поменять класс Node на public, и я должен сохранить приватность. Идея программирования заключается в следующем: прочитать данные из файла в классе TextAnalyzer, затем вставить их в SinglyLinkedList с подсчетом частоты слов. класс singlyLinkedList

   public class SinglyLinkedList<T> {
   private static class Node<T> {
   public T data;
    Node<T> next;
    public Node(T data) {
        this.data = data;
        next = null;
    }
}
Node<T> head;
Node<T> tail;
int size;

public SinglyLinkedList() {
    head = null;
    tail = null;
    size = 0;
}

public void insert(T S) {
    Node<T> temp = new Node<T>(S);
    if (head == null) {
        head = tail = temp;
        size++;
        return;
    }

    temp.next = head;
    head = temp;
    size++;
    return;
}

public void display() {
    Node<T> tmp = head;
    while (tmp != null) {
        System.out.println(tmp.data.toString());
        tmp = tmp.next;

    }

Класс TextAnalyzer

  SinglyLinkedList<WData> list = new SinglyLinkedList<WData>();
   private static class WData {

    String word;
    int freq;

    public WData(String w, int f) {
        word = w;
        freq = f;
    }

    // .. Add other methods here as needed
    @Override
    public String toString() {
        // if(list.)
        return "WData{" + "word=" + word + " , freq=" + freq + '}';
    }
}
  public Scanner sc;

public void processText(String filename) {

    try {
        sc = new Scanner(new File(filename));
        while (sc.hasNext()) {
            String line = sc.next();
            String[] st = line.split(" ");

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

                processWord(st[i]);
        }}
    list.display();
       } catch (FileNotFoundException ex) {
        System.out.println("error in loadstudends Scanner");
    }
}
 public void processWord(String word) {
         Node<WData> temp = list.head;

    while (temp != null) {
        if (temp.data.word.equalsIgnoreCase(word)) {
            break;
        }
        temp = temp.next;
    }
    if (temp == null || Dtemp.data.word.matches(".*\\d.*")) {

        list.insert(new WData(word, 1));

    } else {
        temp.data.freq += 1;
    }
    }}

мы не можем создать узел temp, потому что узел класса является закрытым, поэтому я не смог пойти на цикл

1 Ответ

0 голосов
/ 21 октября 2019

Вы можете сделать следующее 1. Создайте свою собственную реализацию Iterator в SinglyLinkedList

public class MyIterator implements Iterator<T> {
    private Node<T> next = head;
    private Node<T> current = null;
    @Override
    public boolean hasNext() {
      return next != null;
    }
    @Override
    public T next() {
      if (hasNext()) {
        current = next;
        next = current.next;
        return current.data;
      }
      throw new NoSuchElementException();
    }

    @Override
    public void remove() {
      //TODO
    }
  }
Создать SinglyLinkedList для реализации Iterable
public class SinglyLinkedList<T> implements Iterable<T> {
возвращает экземпляр итератора, созданного в 1 при вызове iterator ()
  @Override
  public Iterator<T> iterator() {
    return new MyIterator();
  }
Используется для каждого цикла в вашем классе анализатора текста
...