У меня есть программа, чтобы прочитать список стран и их ВВП из файла и вставить их в MinHeap. Куча - это коллекция (массив) объектов Country. Объект Country имеет два поля. Строковое поле с именем name, которое содержит двухбуквенный код страны и целочисленное поле gdp для хранения значения ВВП. Метод вставки использует значения ВВП в качестве ключей для вставки. Поскольку это MinHeap, страна с минимальным ВВП всегда будет на уровне root. Также все остальные свойства кучи должны выполняться после каждой вставки и удаления. Во входном файле не будет повторяющихся значений ВВП.
Мне нужно заполнить класс Heap. java, чтобы реализовать следующие функции:
removeMinGDP () ; Нужно вывести страну с минимальным ВВП из кучи и вернуть ее. После удаления свойство кучи должно быть восстановлено. верните ноль, если куча была пустой.
removeGivenGDP (int gdp) : должен найти страну с данным значением ВВП и удалить ее. После удаления свойство кучи должно быть восстановлено. Эта функция должна возвращать название страны, которая была удалена. если страна с данным значением ВВП не может быть найдена, верните пустую строку.
Мне нужна помощь по removeMinGDP. Я знаю, что буду удалять root и заменять его на самый большой элемент. Я знаю, что должен подорвать. Я знаю общую идею, но не знаю, как ее реализовать. ТАК ОСНОВНО Я застрял, потому что removeMinGDP не принимает параметры, поэтому мне пришлось создать два закрытых метода, НО я не знаю, что передать в deleteMin.
Я знаю, что я не запускался удалить GivenGDP (но помощь с радостью будет принята). И у меня очень мало опыта в программировании, поэтому, пожалуйста, не ешьте меня живьем.
private Country[] storage; //the actual heap storing elements
private int size; //number of elements currently in the heap
private int cap; //capacity of the heap
Heap (int c) {
size = 0;
cap = c;
storage = new Country[cap];
}
public void insert(Country c) {
if (size >= cap) {
throw new IllegalStateException("Heap is full");
}
int curr = size++;
storage[curr] = c;
while ((curr != 0) && (storage[curr].gdp < storage[parent(curr)].gdp)) {
exch(storage, curr, parent(curr));
curr = parent(curr);
}
}
private void exch(Country[] arr, int i, int j) {
Country tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
private int parent(int i) {
if (i <= 0) return -1;
return (i-1)/2;
}
public int numCountries () {
return size;
}
public boolean isEmpty() {
return size == 0;
}
private boolean isLeaf(int pos)
{
return (pos >= size/2) && (pos < size);
}
private int leftchild(int pos) {
if (pos >= size/2) return -1;
return 2*pos + 1;
}
private int rightchild(int pos) {
if (pos >= (size-1)/2) return -1;
return 2*pos + 2;
}
//***************************************************************************
public Country removeMinGDP() {
/**************************
* remove the country with minimum GDP
* from the heap and return it. restore
* the heap properties.
* return null if heap is empty.
***************************/
if(isEmpty()) return null;
else{
return deleteMin(arr,size);
}
}
private Country deleteMin(Country arr[], int n){
int last = arr[n-1];
Country temp = arr[0];
arr[0] = last;
n = n-1;
downheap(arr,n,0);
return temp.name;
}
private void downheap(Country arr[], int n, int i){
int biggest = i;
int l = 2 * i + 1;
int r = 2 * i + 2;
if(l < n && arr[l].gdp > arr[biggest].gdp) biggest = l;
if(r < n && arr[r].gdp > arr[biggest].gdp) biggest = r;
if(biggest != i){
int swap = arr[i];
arr[i] = arr[biggest];
arr[biggest] = swap;
downheap(arr, n, biggest);
}
}
public String removeGivenGDP(int gdp) {
/**************************
* TODO: find the country with the given GDP
* value and remove it. return the name of
* the country and restore the heap property
* if needed. If no countries with the given GDP
* were found, return empty string ""
***************************/
return "";
}
}
Вот основная функция.
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
class Main {
public static void main(String[] args) throws FileNotFoundException {
File input = new File("countries.txt");
//Creating Scanner instance to read File
Scanner sc = new Scanner(input);
//Create an instance of MinHeap
Heap h = new Heap(10);
//Reading each line of file using Scanner class
while(sc.hasNextLine()){
String[] tokens = sc.nextLine().split(",");
System.out.println("Inserted: " + tokens[0] + " -> " + tokens[1]);
h.insert(new Country(tokens[0], Integer.parseInt(tokens[1].trim())));
}
System.out.println("\n\nTotal number of countries inserted is: " + h.numCountries());
System.out.println("The name of the country with a GDP value of 2314 is " + h.removeGivenGDP(2314));
System.out.println("Total number of countries now is: " + h.numCountries());
System.out.println("\n\nCountries in ascending order of GDP values: ");
while (!h.isEmpty()) {
Country tmp = h.removeMinGDP();
System.out.println(tmp.name + " -> " + tmp.gdp);
}
}
}