当前位置: 首页 > 知识库问答 >
问题:

如何修复堆结构的循环

田彬郁
2023-03-14

代码编译,但当您运行它时,会出现错误消息,给出空指针异常。如底部所见。代码应该从程序中输入的txt文件中读取文本,然后创建一个新的txt文件,其中包含按服务年限排序的第一个txt文件的内容。但是,我一直收到该错误消息。任何帮助都将不胜感激。我在底部添加了错误消息,感谢所有帮助您的人,非常感谢:)

(25分)定义一个Java的类,名为员工。该类有数据成员,并为以下六个数据项中的每一个提供访问器和修改器方法。(这涉及创建文件Employee.java.)

>

  • id(字符串)
  • 名称(字符串)
  • 工资(双倍)
  • 部门(字符串)
  • 位置(字符串)
  • 服务年限(整数)(25分)创建一个文本(数据)文件,其中包含至少五个不同员工(对象)的数据。让每个数据项位于文本文件中自己的行上。例如,文件的前六行可能如下所示:

    086244

    莎莉·史密斯

    100000

    会计

    经理

    7个

    (50分)'Heap'是满足heap属性的基于树的数据结构。max-heap是一个完整的二叉树,其中每个内部节点中的值大于或等于该节点子节点中的值。

    有了堆(或满足堆属性的数组),在数组上执行重要任务会更有效(通常更快),比如找到数组中的最大元素(并删除它)和对数组排序。

    在这个作业中,你必须写一个从文件中读取雇员名单的程序。该文件的名称将为“Employee.txt”。程序应该将排序后的数组输出到一个名为“SortedEmployee.txt”的文件堆html" target="_blank">排序代码:

    public class HeapSort
    {
    
       //heap sort method
       public static <Employee extends Comparable<Employee>> void heapSort(Employee[] list)
       {
          //create a Heap of integers
          Heap<Employee> heap = new Heap<>();
    
          //add elements to the heap
          for (int i = 0; i< list.length; i++)
             heap.add(list[i]);
    
          //remove elements from the heap
          for(int i = list.length - 1; i >= 0; i--)
             list[i] = heap.remove();
       }
    
    
    }  
    

    堆代码:

    import java.util.ArrayList;
    
    public class Heap<Employee extends Comparable<Employee>>
    {  
       private ArrayList<Employee> list = new ArrayList<>();
    
       public Heap(){}
    
       public Heap(Employee[] objects)
       {
          for(int i = 0; i < objects.length; i++)
             add(objects[i]);
       }
       public void add(Employee newObject)
       {
          list.add(newObject);
          int currentIndex = list.size() - 1;
    
          while(currentIndex > 0)
          {
             int parentIndex = (currentIndex -1)/2;
             if(list.get(currentIndex).compareTo(list.get(parentIndex)) > 0)
             {
                Employee temp = list.get(currentIndex);
                list.set(currentIndex, list.get(parentIndex));
                list.set(parentIndex, temp);
             }
             else
                break;
    
             currentIndex = parentIndex;
          }
       }
       public Employee remove()
       {
          if(list.size() == 0) return null;
    
          Employee removeObject = list.get(0);
          list.set(0, list.get(list.size() -1));
          list.remove(list.size() -1);
    
          int currentIndex = 0;
          while(currentIndex < list.size())
          {
             int leftChildIndex = 2 * currentIndex + 1;
             int rightChildIndex = 2 * currentIndex + 2;
             if(leftChildIndex >= list.size()) break;
             int maxIndex = leftChildIndex;
             if(rightChildIndex < list.size())
             {
                if(list.get(maxIndex).compareTo(list.get(rightChildIndex)) < 0)
                   maxIndex = rightChildIndex;
             }
             if(list.get(currentIndex).compareTo(list.get(maxIndex)) < 0)
             {
                Employee temp = list.get(maxIndex);
                list.set(maxIndex, list.get(currentIndex));
                list.set(currentIndex, temp);
                currentIndex = maxIndex;
             }
             else
                break;   
          }
          return removeObject;
        }
        public int getSize()
        {
          return list.size();
        }
    
        public void print()
        {
          for (int i = 0; i <= getSize()-1; i++)
          {
             System.out.print("Index: " + i + " Data: " + list.get(i));
    
             System.out.println();
          }
        } 
    }
    

    员工对象类:

    public class Employee implements Comparable<Employee>
    {
       private String id;
       private String name;
       private double salary;
       private String department;
       private String position;
       private int yos;
       public Employee(String id, String name, double salary,String department,String position,int yos)
       {
          this.id = id;
          this.name = name;
          this.salary = salary;
          this.department = department;
          this.position = position;
          this.yos = yos;
       }
       public void setid(String id)
       {
          this.id = id;
       }
       public void setname(String name)
       {
          this.name = name;
       }
       public void setsalary(double salary)
       {
          this.salary = salary;
       }
       public void setdepartment(String department)
       {
          this.department = department;
       }
        public void setposition(String position)
       {
          this.position = position;
       }
       public void setyos(int yos)
       {
          this.yos = yos;
       }
       public String getid()
       {
          return id;
       }
       public String getname()
       {
          return name;
       }
        public double getsalary()
       {
          return salary;
       }
        public String getdepartment()
       {
          return department;
       }
       public String getposition()
       {
          return position;
       }
        public int getyos()
       {
          return yos;
       }
       public int compareTo(Employee emp)
       {
          return (this.yos - emp.yos);
       }
       public String toString()
       {
          return "ID=" + this.id+ ", name=" + this.name+ ", salary= $" + this.salary+ ", department:" + this.department+ ", postion:" + this.position+ ",yos= $" + this.yos + "]\n";
       }
    }
    

    演示代码:

     import java.util.*;
    import java.io.*;
    
    
    public class EmployeeDemo
    {
       public static void main(String[] args)throws IOException
       {
          Employee[] list = new Employee[5];
             Scanner keyboard = new Scanner(System.in);
    
             System.out.println("Please enter the text file: ");
             String fileName = keyboard.nextLine();
    
             File myFile = new File(fileName);
             Scanner inputFile = new Scanner(myFile);
    
          //Read all of the values from the file
          //and calculate their total
    
    
             //Read a value from the file
             String id = inputFile.nextLine();
             String name = inputFile.nextLine();
             double salary = inputFile.nextDouble();
             String clear = inputFile.nextLine();
             String department = inputFile.nextLine();
             String position = inputFile.nextLine();
             int yrService = inputFile.nextInt();
             String llear = inputFile.nextLine();
    
             list[0] = new Employee(id,name,salary,department,position,yrService);
    
    
    
    
    
    
          //close the file
    
    
         // File o = new File("SortedEmployee.txt");
            //o.createNewFile();
          System.out.println("Enter the file name to be transfered to: ");
          String filename = keyboard.nextLine();
          PrintWriter outputFile = new PrintWriter(filename);//dont need the top
    
    
          //HeapSort<Employee> h = new heapSort<Employee>(Employee);
          HeapSort.heapSort(list);
    
          //Display the sum of the numbers
          while(inputFile.hasNext())//this loop is wrong too
          {
    
             outputFile.println(list[0].toString());
    
          }
          outputFile.close();
           inputFile.close();
          System.out.print("File Sorted and Transferred");
    
       }
    }
    

    这是我收到的错误消息:

    Please enter the text file: 
    C:\Users\jose385\Desktop\Employee.txt
    Enter the file name to be transfered to: 
    green
    Exception in thread "main" java.lang.NullPointerException
        at Heap.add(Heap.java:22)
        at HeapSort.heapSort(HeapSort.java:13)
        at EmployeeDemo.main(EmployeeDemo.java:50)
    
     ----jGRASP wedge2: exit code for process is 1.
     ----jGRASP: operation complete.
    
  • 共有1个答案

    傅献
    2023-03-14

    您使< code>List的大小为5

    Employee[] list = new Employee[5];
    

    但只添加一个元素

    list[0] = new Employee(id,name,salary,department,position,yrService);
    

    实际上,只对一个元素排序有什么意义

    还要尝试按照有关实现可比性的正确方法的教程进行操作

     类似资料:
    • 主要内容:选择结构,循环结构C语言中常用的编程结构有三种(其它编程语言也是如此),它们分别是: 顺序结构:代码从前往后依次执行,没有任何“拐弯抹角”,不跳过任何一条语句,所有的语句都会被执行到。 选择结构:也叫分支结构。代码会被分成多个部分,程序会根据特定条件(某个表达式的运算结果)来判断到底执行哪一部分。 循环结构:程序会重新执行同一段代码,直到条件不再满足,或者遇到强行跳出语句(break 关键字)。 选择结构 选择结构

    • 任何编程语言中最常见的程序结构就是顺序结构。顺序结构就是程序从上到下逐行的执行,中间没有任何判断和跳转。 如果 main 方法的多行代码之间没有任何流程控制,则程序总是从上向下依次执行,排在前面的代码先执行,排在后面的代码后执行。这意味着:如果没有流程控制, Java 方法里的语句是一个顺序执行流,从上向下依次执行每条语句。 不论哪一种编程语言,都会提供两种基本的流程控制结构:分支结构和循环结构。

    • 在android a有一个URL像http://api.openweathermap.org/data/2.5/forecast/daily?q=khulna 所以我使用Uri构建器 但输出 http://api.openweathermap.org/data/2.5/forecast/daily?q=khulna 这里有两个额外的字符'&'和'='; 我将这个URI转换为字符串,并使用repla

    • 我试图创建一个简单的while循环,它将运行start、stop、quit和help命令。“启动”、“停止”和“帮助”将仅显示一些打印文本。在它们运行之后,我希望它继续执行另一个命令。然而,在退出时,我希望整个程序停止。

    • 6.2.3 循环结构 循环结构是一个重要的程序结构,它具有重复执行某段程序的功能。通常,循环结构包括以下四个组成部分: 1、循环初始化部分——初始化循环控制变量、循环体所用到变量; 2、循环体部分——循环结构的主体; 3、循环调整部分——循环控制变量的修改、或循环终止条件的检查; 4、循环控制部分——程序执行的控制转移。 以上四部分可以在程序中用各种不同的形式体现出来,有时也并非清析地表达出来。常