Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 生成一个保持有序数组的insert()方法_Java_Arrays_Sorting_Comparable - Fatal编程技术网

Java 生成一个保持有序数组的insert()方法

Java 生成一个保持有序数组的insert()方法,java,arrays,sorting,comparable,Java,Arrays,Sorting,Comparable,我正在尝试创建一个insert()方法,该方法使用compareTo方法(没有排序算法,只使用compareTo)。 当我做list.insert(dd)到list.insert(aa)时,它可以工作,但对于list.insert(dd)到list.insert(aa)不起作用,我知道为什么,但不知道如何修复它。insert方法在第二个类中 我再次尝试使insert()方法保持已排序的数组。 例如: int[] Array = {1,2,6,7,9}; Array.insert(3); Arra

我正在尝试创建一个
insert()
方法,该方法使用
compareTo
方法(没有排序算法,只使用
compareTo
)。 当我做
list.insert(dd)
list.insert(aa)
时,它可以工作,但对于
list.insert(dd)
list.insert(aa)
不起作用,我知道为什么,但不知道如何修复它。
insert
方法在第二个类中

我再次尝试使
insert()
方法保持已排序的数组。 例如:

int[] Array = {1,2,6,7,9};
Array.insert(3);
Array.insert(8);
System.out.println(Array); // should print out 1,2,3,6,7,8,9
至少如果我是用整数工作的话。在下面的代码中,我处理的是课程

课程:

import java.io.Serializable;
import java.util.*;

class Course implements Comparable<Object>, Serializable {
    private String _prefix;
    private int _number;
    private String _department;
    private String _grade;

    public Course(String prefix, int number, String department, String grade) {
        _prefix = prefix;
        _number = number;
        _department = department;
        if (grade == null)
            _grade = "";
        else
            _grade = grade;
    }

    public Course(String prefix, int number, String Department) {
        this(prefix, number, Department, "");
    }

    public String getPrefix() {
        return _prefix;
    }

    public int getNumber() {
        return _number;
    }

    public String getDepartment() {
        return _department;
    }

    public String getGrade() {
        return _grade;
    }

    public void setGrade(String grade) {
        _grade = grade;
    }

    public boolean taken() {
        return !_grade.equals("");
    }

    public boolean equals(Object other) {
        boolean result = false;
        if (other instanceof Course) {
            Course otherCourse = (Course) other;
            if (_prefix.equals(otherCourse.getPrefix())
                    && _number == otherCourse.getNumber())
                result = true;
        }
        return result;
    }

    public int compareTo(Object o) {
        Course temp = (Course) o;

        if (_department.compareTo(temp.getDepartment()) == 0) {
            if (_number < temp.getNumber()) {
                return -1;
            } else if (_number > temp.getNumber()) {
                return 1;
            } else if (_number == temp.getNumber()) {
                if (_prefix.compareTo(temp.getPrefix()) == 0) {
                    return 0;
                } else if (_prefix.compareTo(temp.getPrefix()) == 1) {
                    return 1;
                } else if (_prefix.compareTo(temp.getPrefix()) == -1) {
                    return -1;
                }
            }

        } else if (_department.compareTo(temp.getDepartment()) > 0) {
            return 1;
        } else if (_department.compareTo(temp.getDepartment()) < 0) {
            return -1;
        }

        return 0;

    }

    public String toString() {
        String result = _prefix + " " + _number + ": " + _department;
        if (!_grade.equals(""))
            result += "  [" + _grade + "]";
        return result;
    }
}
class CourseList {
    private Course[] _courseList;
    private int _size = 0;

    public CourseList() {
        // setting the current size of the array to 0 since a list starts with 0
        // elements
        _courseList = new Course[_size];
    }

    public int size() {
        return _size;
    }

    public void insert(Course courseToInsert) {

        Course[] tempCourseList = new Course[_size + 1];

        if (_size == 0) // if size = 0
        {
            tempCourseList[0] = courseToInsert;
            _size++; // used to tell if we need to increment the size or not
        }

        else // if size > 0
        {
            for (int i = 0; i < _size; i++) {

                if (courseToInsert.compareTo(_courseList[i]) == -1) // if less
                    // than
                {
                    tempCourseList[i] = courseToInsert;

                    for (int j = i; j < _size; j++) {
                        tempCourseList[j + 1] = _courseList[i];
                        i++;
                    }
                    _size++;
                }

                else {
                    if (i == _size - 1) {
                        tempCourseList[i + 1] = courseToInsert;
                        _size++;
                    }

                    /*
                     * else if (i < _size) { for (int j = i; j < _size; j++) {
                     * tempCourseList[j+1] = _courseList[j]; } }
                     */
                }
            }
        }

        _courseList = tempCourseList;
    }

    public String toString() {
        String stringToReturn = "Contents of List:\n\n";

        for (Course a : _courseList) {
            stringToReturn += a + "\n";
        }

        return stringToReturn;
    }
}
public class Driver {
    public static Scanner kb = new Scanner(System.in);

    public static void main(String[] args) {
        CourseList list = new CourseList();

        Course ff = new Course("IEE", 380, "Engineering");
        Course a = new Course("EEE", 230, "Engineering");
        Course b = new Course("MAT", 150, "Liberal Arts");
        Course c = new Course("PHY", 150, "Liberal Arts");
        Course d = new Course("PHI", 304, "Liberal Arts");
        Course e = new Course("ECN", 214, "W.P. Carey");
        Course f = new Course("EEE", 120, "Engineering");

        Course aa = new Course("PHI", 304, "AAAAAA");
        Course bb = new Course("ECN", 214, "BBBBBB");
        Course cc = new Course("EEE", 120, "CCCCCC");
        Course dd = new Course("EEE", 120, "DDDDDD");

        // System.out.println( aa.compareTo(aa) );
        // System.out.println( aa.compareTo(bb) );
        // System.out.println( bb.compareTo(aa) );

        String bbb = "BBB";
        String aaa = "AAA";

        /*
         * list.insert(dd); list.insert(cc); // works list.insert(bb);
         * list.insert(aa);
         */

        list.insert(aa);
        list.insert(bb);
        /*
         * list.insert(cc); list.insert(dd);
         */

        System.out.println(list);
    }
}

您不需要在这里创建自己的方法,Arrays.binarySearch()将告诉您将其放置在何处。简单地说:

Course[] temp = new Course[_courseList.size()]
_courseList.toArray(temp);
_courseList.add(Math.abs(Arrays.binarySearch(temp,courseToInsert)) - 1,courseToInsert);

你完成了。不要重新发明轮子,几乎所有的东西都已经存在于库中了。如果您有java 1.8,您也可以删除临时数组。

您的比较函数正在检查
x.compareTo(y)=-1
x.compareTo(y)==1
,而
Comparable
接口允许
compareTo
返回任何整数。您应该检查
<0
>0
,而不是
=-1
==1
。否则,比较函数是不可传递的。当插入不起作用时,输出是什么?线程“main”java.lang.ArrayIndexOutOfBoundsException中的异常:1在CourseList.insert(Driver.java:155)在Driver.main(Driver.java:249)基本上是_couseList[i]当我检查它是否小于时不存在,因为I=0,但_courseList的大小也是1。@AdamStaples,是的,但问题不是返回值,而是它比较字符串并假设
String。compareTo
仅在
String时返回(-1,0,1)。compareTo
可以返回超出该范围的值。赋值:“先按部门,然后按课程编号订购课程。然后编写一个使用有序列表来维护课程列表的程序。“你不能对有序列表使用内置Java数据结构。你可以使用数组实现或链表实现。”你在文章中没有提到你不能使用库。