Java 对象 [] 排序

标签 java sorting comparable

每次添加对象时,我都试图对创建的对象数组进行排序。我写了一个 compareTo 方法,它打印出每一行,但是当我尝试对它进行排序时抛出异常。我正在初始化 99 个元素 (maxLen) 的 Element[],然后使用 topIndex 作为计数器来查找“实际”长度。扫描仪用于获取用户输入以创建元素。编辑——我添加了完整的代码。

import java.util.Arrays;
import java.util.Scanner;



public class mainmenu {
static Element[] data = new Element[100];
static int maxLen= 99; 
static int topIndex= -1;
@SuppressWarnings("rawtypes")


public static void main(String[] args){


    menu();


}


public static void menu(){
    boolean leave = true;
    Scanner in = new Scanner(System.in);
    while(leave){
        //loop. unless value is 1-7, keeps recycling    
        System.out.println("Please select a menu option: ");
        System.out.println("'1'- enque ");
        System.out.println("'2'- deque");
        System.out.println("'3'- peek");
        System.out.println("'4'- display");
        System.out.println("'5' empty queue");
        System.out.println("'6'- check if the queue is empty");
        System.out.println("'7' to exit the program");
        String select = in.next();
        if ((select.equals("1") || select.equals("2")|| select.equals("3")|| select.equals("4")|| 
                select.equals("5")|| select.equals("6")|| select.equals("7")))
            leave = callMethods(select );
        else{
            System.out.println("Please enter a valid menu option.");
        }
    }
}

public static  boolean callMethods(String select )
{
    boolean leave= true;
    int sel = Integer.parseInt(select);

    switch(sel){
    case 1:

        enqueue();

        break;
    case 2:
        dequeue();
        break;
    case 3:
        peek();

        break;
    case 4:
        display();

        break;
    case 5:
        empty();

        break;
    case 6:
        if( isEmpty()){
            System.out.println("The structure is empty");
        }
        else{
            System.out.println("The structure is not empty.");
        }
        break;
    case 7:
        System.out.println("Bye!");
        leave = false;
    }
    return leave;
}

public static void enqueue(){
    boolean isInt = false;
    String st = null;
    int index = 0;
    Scanner in = new Scanner(System.in);

    while(!isInt){  //loop continues until input is an integer type
        System.out.println("Please enter a priority level for this element");
        st = in.next();
        if (isInteger(st) == true){// calls method to check if value is integer
            index = Integer.parseInt(st);//parses the string into a integer
            isInt = true;
        }
        else //if value isnt integer, try again
            System.out.println("Invalid Input.");
    }
    System.out.println("Please enter the string of information.");
    String info = in.next();

    Element e = new Element(info, index);

    if (topIndex == maxLen){
        System.out.println("Data Structure is full.");
    }
    else if (isEmpty()){
        data[0] = e;
        topIndex++;
    }
    else {
        topIndex++;
        data[topIndex]=e;
        System.out.println("Added "+ e.getPriority() + " at "+ e.getInfo());
        System.out.println(topIndex);

        Arrays.sort(data);

    }

}

private static boolean isInteger(String s) {
    //checks to see if string can be parsed as an integer.


    try{
        Integer.parseInt(s);
        return true;
    }
    catch( Exception e ){
        return false;
    }


}
public static void dequeue(){
    if(isEmpty()){
        System.out.println("The structure is empty.");
    }
    else{
        Element e = data[topIndex];
        System.out.println("Removing Element: " + e.getInfo()+ " Priority Level: " + e.getPriority());
        --topIndex;
    }
}

public static void peek(){
    if (isEmpty()){
        System.out.println("The structure is empty.");

    }
    else {
        Element e = (data[0]);
        System.out.println("Element: " +  e.getInfo()+ " Priority Level: " + e.getPriority());
    }
}

public static void display(){
    System.out.println("topIndex " + topIndex);
    if (topIndex==-1){
        System.out.println("The structure is empty.");

    }
    else {
        for(int i = 0; i <= topIndex; i++){
            System.out.println("Index: " +i);
            Element e = data[i];
            System.out.println("Element: " + e.getInfo()+ " Priority Level: " + e.getPriority());

        }
    }
}

public static void empty(){
    System.out.println("Erasing data.");
    topIndex=-1;
}

public static boolean isEmpty(){
    return (topIndex==-1);
}

和元素类:

public class Element implements Comparable<Element>  {

private String info;
private int index;

public Element ( String st, int ind) {
    super();
    this.info = st;
    this.index= ind;

}


public String getInfo() {
    return info;
}
public void setInfo(String st) {
    this.info = st;
}

public int getPriority(){
    return index;
}
public void setPriority(int pr){
this.index = pr;
}


public int compareTo(Element e) {
    System.out.println(e.index+ ""+ e.info);
//  if (!(e instanceof Element))
//      throw new ClassCastException("An Element object expected.");
    int ePriority = e.getPriority();  
    System.out.println(ePriority);
    System.out.println(this.index);
    int balls= this.index - ePriority;    
    System.out.println(balls);
    return balls;
}

最佳答案

Arrays.sort 要求所有数组元素都为非空。您只想对非空部分进行排序,因此将 Array.sort(data) 替换为 Arrays.sort(data, 0, topIndex + 1)

Arrays.sort(Object[], int, int)

不要像其他人建议的那样修改 compareTo 以允许 null 参数,因为 Comparable 的契约规定您的实现应该抛出 NullPointerException .

Comparable.compareTo(T)

关于Java 对象 [] 排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20319968/

相关文章:

java - ArrayList.sort() 方法中的 IllegalArgumentException

java - iText7 图像透明度

javascript - 按第一个键值对 JavaScript 数组进行排序

language-agnostic - 创建可以排序的字符串的哈希

java - java中bean对象列表按字母升序排序

Java 类型删除和重载?

c++ - 排序函数不适用于在堆栈上创建的函数对象?

java - 如何在一般程序中实现对象数组的二分查找?

java - 在 3 个不同的类别上使用可比较的

java - Guava future 等待回调