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数据结构。你可以使用数组实现或链表实现。”你在文章中没有提到你不能使用库。