【发布时间】:2017-04-17 21:26:18
【问题描述】:
我正坐在大学的作业中,我担心我还没有真正理解 Java 或 OOP 概念中的一些基本知识。我会尽量缩短它(也许只看第三个代码段就足够了,但我只是想确保我包含了足够的细节)。我要写一点员工管理。该项目中的一个类是employeeManagement 本身,该类应该具有通过冒泡排序按首字母排序员工的方法。
我为此编写了 3 个类:第一个是“Employee”,它包含一个名称和一个 ID(一个流水号)、getter 和 setter 方法以及一个用于检查一个员工的第一个字母是否更小的方法(在字母表中较低)比另一个。它看起来像这样:
static boolean isSmaller(Employee source, Employee target) {
char[] sourceArray = new char[source.name.length()];
char[] targetArray = new char[target.name.length()];
sourceArray = source.name.toCharArray();
targetArray = target.name.toCharArray();
if(sourceArray[0] < targetArray[0])
return true;
else
return false;
}
我测试了它,它似乎适用于我的情况。现在还有另一个名为 EmployeeList 的类,它通过一组员工(“员工”对象)管理员工。这个数组的大小是通过构造函数确定的。我的代码如下所示:
public class EmployeeList {
/*attributes*/
private int size;
private Employee[] employeeArray;
/* constructor */
public EmployeeList(int size) {
this.employeeArray = new Employee[size];
}
/* methods */
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
/* adds employee to end of the list. Returns false, if list is too small */
boolean add(Employee m) {
int id = m.getID();
if (id > employeeArray.length) {
return false;
} else {
employeeArray[id] = m;
return true;
}
}
/* returns employee at certain position */
Employee get(int index) {
return employeeArray[index];
}
/* Sets employee at certain position. Returns null, if position doesn't exist. Else returns old value. */
Employee set(int index, Employee m) {
if (employeeArray[index] == null) {
return null;
} else {
Employee before = employeeArray[index];
employeeArray[index] = m;
return before;
}
}
现在我的真正问题来了:在名为“employeeManagement”的第三个类中,我应该实现排序算法。这个类看起来像这样:
public class EmployeeManagement {
private EmployeeList ml = new EmployeeList(3);
public boolean addEmployee(Employee e) {
return ml.add(e);
}
public void sortEmployee() {
System.out.println(ml.getSize()); // I wrote this for debugging, exactly here lies my problem
for (int n = ml.getSize(); n > 1; n--) {
for (int i = 0; i < n - 1; i++) {
if (Employee.isSmaller(ml.get(i), ml.get(i + 1)) == false) {
Employee old = ml.set(i, ml.get(i + 1));
ml.set(i+1, old);
}
}
}
}
我的评论之前的“println”在控制台中返回“0”......我期待“3”,因为这是我在“EmployeeManagement”类中将“EmployeeList”作为构造函数的参数提供的大小。我的错误在哪里?以及如何访问我在“EmployeeManagement”类(“3”)中创建的对象的大小?我真的很期待你的回答!
谢谢, 膈肌
【问题讨论】:
-
isSmaller写成return source.name.charAt(0) < target.name.charAt(0);更容易(也更有效)。 -
...但是您还会遇到名称以相同字符开头或长度为零的问题。有充分的理由不使用
return source.name.compareTo(target.name);吗? -
就像 Elliott 的回答所说,问题可能与您对 OOP 的理解无关,但基于其他一些事情,我怀疑您确实存在一些误解。在
isSmaller中,您似乎认为您正在使用new char[source.name.length()]为数组预先分配空间,但您不需要这样做,事实上该数组只是被丢弃了。 Java 中的char[]实际上更像是其他一些语言中的指针。toCharArray已经在堆上分配了一个数组并返回对它的引用。参见例如stackoverflow.com/q/40480/2891664
标签: java oop object constructor