Хэш-структура в вопросах Java - PullRequest
1 голос
/ 19 сентября 2019

Вот проблема HW:

На этом этапе вы решаете внедрить структуру Hash для данных участника для подготовки к поиску.Вы будете читать информацию о вкладчике из предоставленного файла;это файл с разделителями-запятыми (CSV).После прочтения каждой записи создайте хэш-таблицу для поля идентификатора.Ограничение для хэш-таблицы состоит в том, что она имеет размер 5, поэтому вы должны иметь возможность обрабатывать коллизии.Столкновения должны быть разрешены путем использования связанного списка значений ID (реализуйте это с помощью стека).Ваш дизайн должен включать следующее:

Хеш-таблица, указывающая на структуру для связанного списка, которая содержит только следующую информацию:

Каждый элемент столкновения хеш-памяти будет иметь следующую информацию:

ID: целое число;// ключ идентификатора для будущих нужд Функции / методы Hash Bucket:

Конструктор ввода: // принять строку для имени и дополнительную информацию для каждого участника (вам потребуется только часть идентификатора входных данных)Конструктор хэш-функции: (Подсказка: у вас есть только 5 блоков хеш-функции, поэтому функция может быть очень простым вычислением.) Конструктор всплывающих окон Конструктор Push Конструктор печати: // для отображения содержимого корзины хеш-функции.Полностью документированная программа для загрузки хэш-таблицы с обработкой коллизий в виде связанного списка, реализованного в виде стека. План тестирования, показывающий, как программа выполняется и может быть выполнена. Снимок экрана, показывающий, что программа загрузила данные и после того, как все данныезагружен, показывает содержимое первого блока Hash (в идеале это Bucket 0)

Я считаю, что я очень близко подошел, но я привык к Python, поэтому я пытаюсь использовать синтаксис Javaучиться.В любом случае, проверьте код ниже, чтобы увидеть, что я сделал.

Я полагаю, что проблема связана с тем, как я объявляю размер хеш-таблицы.В Python я могу просто проиндексировать массив и добавить данный объект в эту позицию в массиве.Кажется, я не могу сделать это в Java, хотя.Я подумывал попробовать цикл for, но это не сработало

Мне кажется, я довольно близко.Большая часть кода была предоставлена ​​профессором, но я разработал класс и методы Stack () самостоятельно.Когда я запускаю их, они работают, и я получил 100% на эту долю.

В результате отладки, которую я сделал, я вижу, что инициализирую массив размером «размер» (в данном случае 5).Однако я не могу понять, как назначить пару ключ-значение для данного индекса Stack ().

Опять же, я привык к Python и мало знаю java, поэтому я действительно считаю, что я не понимаю синтаксис Java.

В python я просто делал бы что-то вроде массива [index] .append [node].Затем я могу вытолкнуть массив [index] и отобразить узел по одному.

import java.util.Scanner;
import java.io.File;
import java.util.regex.Pattern;

public class ContributorManager {
    public static void main(String [] args) {
        Scanner inputFile = null;
        String name = null;
        String city = null;
        String country = null;
        String phone = null;
        double contribution = 0;
        int id = 0;
        Contributor c = null;
        Node node = null;
        HashTable h = new HashTable(5); 

        //open contributors file
        try {
            inputFile = new Scanner(new File("/Users/Dan/Desktop/contributors.csv"));
            System.out.println("AsdasdfaDSF");
            inputFile.useDelimiter(Pattern.compile("(\\n)|(\\r)|,"));
        }
        catch (Exception e) {
            System.err.println("Error opening file.");
        }

        //create contributors object for each row, and add to the stack
        while (inputFile.hasNext()) {
            name = inputFile.next();
            city = inputFile.next();
            country = inputFile.next();
            phone = inputFile.next();
            contribution = inputFile.nextDouble();
            id = inputFile.nextInt();
            inputFile.nextLine(); //advance to the next line

            c = new Contributor(name, city, country, phone, contribution, id); 
            node = new Node(c);
            //System.out.println(c.hashFunction());
            h.insert(node); //insert node into the hash table
        }

        h.print(); //print the entire hash table
    }
}

public class Contributor {
    private String name;
    private String city;
    private String country;
    private String phone;
    private double contribution;
    private int id;

    public Contributor(String name, String city, String country, String phone, double contribution, int id) {
        this.name = name;
        this.city = city;
        this.country = country;
        this.phone = phone;
        this.contribution = contribution;
        this.id = id;
    }

    public int hashFunction() {
        //calculate the hash key value using the id member variable in this object
        //the key must always return a value between 0 and 4
        int key = this.id % 5;
                return key;
        //return the hash key value
    }

    public void printContributor() {
        System.out.println("Name: " + name);
        System.out.println("City: " + city);
        System.out.println("Country: " + country);
        System.out.println("Phone: " + phone);
        System.out.println("Contribution: " + contribution);
        System.out.println("ID: " + id);
        System.out.println();
    }
}

import java.util.LinkedList;

public class HashTable {
    Stack[] table;
private int size;
    private int top;
        //declaring array

    public HashTable(int size) {
        //initialize the table array with empty Stack objects
        table = new Stack[size];
        System.out.println(table.length);



    }

    public void insert(Node n) {
        //determine the hash key of Node n
                System.out.println(n);
                int key = n.c.hashFunction();
                System.out.println(key);
        //using the key to determine the table location, 
        //push Node n onto the stack
                System.out.println(table.length);

                table[key].push(n);



    }

    public void print() {
        //display the contents of the entire table in order
        for (int i=0; i < table.length; i++) {
            System.out.println("===== Position " + i + " ======\n");
            table[i].print();
            System.out.println("========= End ==========");
            System.out.println();
        }

    }
}

public class Node {
    Contributor c;
    Node next;

    public Node(Contributor data){
        //initialize member variables
        c=data;
        next=null;
    }

   public void displayNode() {
    //display the contents of this node
        c.printContributor();
  }
}

public class Stack {
    Node first; 

    public Stack(){
        //initialize the empty stack
        first = null;
    }

    public void push(Node newNode){
        //if the stack is empty, make first point to new Node.
        if(first==null)
            first=newNode;  
        //if the stack is not empty, loop until we get to the end of the list,
        //then make the last Node point to new Node
        else
        {
            first=newNode;
            newNode = newNode.next;
         }
    }

    public Node pop() { 
        //if the stack is empty, return null
        if(first==null)
            return null;
        //Handle the case where there is only one Node in the stack  
        else if(first.next==null)
        {
            Node t=first;
            return t;   
        }
        //Handle the case where there are at Least two (or more) elements in the stack
        else
        {
            Node t=first;
            return t;   
        }  
    }

    public void print() {
        //display the entire stack
        Node tempDisplay = first; // start at the beginning of linkedList
        while (tempDisplay != null){ // Executes until we don't find end of list.
            tempDisplay.displayNode();
            tempDisplay = tempDisplay.next;
        }  
        System.out.println();
    }
}

contributor.csv

Tim,Murphy,USA,8285557865,200,25
Gordon,Miner,USA,8285551008,150,32
Jean,Bell,USA,8285557503,225,33
Mike,Prather,USA,8285558497,155,34
George ,Pipps,USA,8285557777,100,35

1 Ответ

0 голосов
/ 19 сентября 2019

Однако я не могу понять, как назначить пару ключ-значение для данного индекса Stack ().

Стек не является массивом.Индексное присвоение не является поддерживаемой операцией, только push и pop с одного конца структуры.


Похоже, у вас проблемы с операциями push и pop?Ваши комментарии к коду указывают, что нужно сделать. если стек не пустой, то loop до конца

У вас нет цикла, и вы, кажется, вставляете его в стек задом наперед.

Вместо этого вам, вероятно, понадобится что-то вроде следующего, очень похожее на метод печати

Node n = first;
while (n.next != null) n = n.next;
n.next = newNode;

Аналогично для выталкивания вы остановите цикл, когда n.next != null && n.next.next == null, чтобы вы моглиустановите n.next = null и вытяните его из списка

//TODO: loop logic 
Node toPop = n.next;
n.next = null;
return toPop;
...