按字母顺序向数组添加元素

时间:2014-04-16 23:34:14

标签: java arrays

我正在编写一个程序,将电话条目添加到员工电话目录中,我想按字母顺序(使用姓氏)将元素添加到数组中,而不是添加元素,然后每次新条目时调用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());
}

我不确定在找到正确位置后如何将数组中的元素向右移位?谢谢你们所有人的帮助。

4 个答案:

答案 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已经具有可比性。

由于这是一个家庭作业,我认为最好只给你一些如何继续的建议,而不是给你代码 -

在您的方法中,您不需要对数组进行排序,只需将其插入数组中的正确位置即可。

  1. 从第一个索引开始循环遍历数组
  2. 当您遍历数组中的每个元素时,您必须检查以下两个条件
    1. 是元素null
    2. 是当前元素的surname,大于surname - 方法的参数
  3. 一旦找到满足上述任何条件的元素,记录索引并打破循环
  4. 然后,从该索引开始将其余元素移至右侧
  5. 最后为提供的参数创建Entry的新实例,并将其设置为该索引
  6. 注意:这不会处理数组中空间不足的情况。


    更新

    我认为你混淆了我的回答和@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.binarySearchSystem.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类的方法。