我正在编写一个程序,将电话条目添加到员工电话目录中,我想按字母顺序(使用姓氏)将元素添加到数组中,而不是添加元素,然后每次新条目时调用Arrays.sort被添加,因为效率会降低。这是我到目前为止的一些代码,我不知道如何将数组中的每个元素与下面的元素进行比较,依此类推。
public class ArrayDirectory implements Directory {
Entry [] directory = new Entry [50];
@Override
public void addEntry(String initials, String surname, int extension) {
//Entries are added here in alphabetical order
}
这是我的入门课程 -
public class Entry {
private String initals,surname;
private int extention;
public Entry(String initals, String surname, int extention){
this.initals = initals;
this.surname = surname;
this.extention = extention;
}
public String getInitals(){
return initals;
}
public String getSurname(){
return surname;
}
public int getExtention(){
return extention;
}
}
任何建议,我是否覆盖compareTo?感谢
编辑 - 应该注意到我被要求使用数组。对不起,感到困惑。
编辑2:更新了我的addEntry方法并覆盖了条目中的compareTo -
public void addEntry(String initials, String surname, int extension) {
for (int i = 0; i < directory.length; i++) {
if (directory[i] != null) {
int y = directory[i].getSurname().compareTo(surname);
if (y == 1) {
int position = i;
break;
}
} else if (directory[i] == null) {
int position = i;
break;
}
}
}
我的compareTo方法 -
public int compareTo(Entry other) {
return this.surname.compareTo(other.getSurname());
}
我不确定在找到正确位置后如何将数组中的元素向右移位?谢谢你们所有人的帮助。
答案 0 :(得分:1)
如果您不必使用数组,则使用错误的数据结构。
无论您需要实施可比较的路径:
public class Entry implements Comparable<Entry>{
..
@Override
public int compareTo(Entry other) {
// TODO Auto-generated method stub
return this.surname.compareTo(other.getSurname());
}
..
考虑使用SortedSet:
Set<Entry> map = new TreeSet<Entry>();
map.add(new Entry("JEH", "Hamlet", 123));
map.add(new Entry("AAC", "Adams", 123));
map.add(new Entry("FAM", "Monti", 321));
将按所需顺序打印。如果必须使用数组,则需要在插入时对其进行排序。
答案 1 :(得分:0)
您可以使Entry
具有可比性,并在其中实施compareTo
。但在这种情况下你并不需要因为String
已经具有可比性。
由于这是一个家庭作业,我认为最好只给你一些如何继续的建议,而不是给你代码 -
在您的方法中,您不需要对数组进行排序,只需将其插入数组中的正确位置即可。
surname
,大于surname
- 方法的参数Entry
的新实例,并将其设置为该索引注意:这不会处理数组中空间不足的情况。
更新
我认为你混淆了我的回答和@David Wallace的回答。我不建议实施compareTo
。此外,你至少试一试并回来是很棒的。
int position = -1; //declare the position outside (if declared inside, it's not visible outside the loop)
for (int i = 0; i < directory.length; i++) {
// position = i; just assign value of i inside the loop
}
//use the position after the loop
int j = position; // start at position
Entry temp = null; // temp will temporarily hold the entry at the next index
while(true) {
temp = directory[j + 1]; // since we need move entry at j to j+1, first we need save the entry at j+1
directory[j + 1] = directory[j]; // entry at j to j+1
if(temp == null) { // if the next entry is null, don't really need to move no more, so break
break;
}
}
// finally place new entry at index position
directory[position] = //the new Entry
答案 2 :(得分:0)
让Entry
实施Comparable<Entry>
并在compareTo
课程中编写相应的Entry
方法。然后,在您的insert
方法中,您想要
Arrays.binarySearch
在数组中找到正确的位置以插入条目。System.arraycopy
将数组中的所有内容移到适当的位置后面的一个位置。 您想查看Arrays.binarySearch
和System.arraycopy
的Javadoc。
答案 3 :(得分:0)
首先,除非你绝对拥有,否则永远不要使用数组。使用Collecctions代替它们 - 它们更易于处理,并且支持您通常希望对一组事物执行的大量操作。
在您的情况下,TreeSet
将是一个不错的选择。如果您只想按此用法(通常不是)按姓氏对条目进行排序,则可以将客户Comparator
传递给constructor:
Set<Entry> directory = new TreeSet<>(new Comparator<Entry>() {
@Override
public int compare(Entry o1, Entry o2) {
return o1.getSurname().compareTo(o2.getSurname());
}
});
如果您的总是想要使用姓氏对Entry
个对象进行排序,请让Entry
类实现Comparable<Entry>
并将代码移到compareTo()
Entry
类的方法。