按顺序将字符串添加到arraylist

时间:2015-02-10 04:47:57

标签: java sorting arraylist

我正在写一个名为HighSchool的课程,其中有一个叫做大学的字符串的arraylist。我的目标是创建一个名为addCollege(String c)的方法,该方法接受字符串,检查列表,然后只要字符串已经不在列表中,就会按正确的字母顺序排列。这是我到目前为止所做的,但它只对列表的第一部分进行了排序。我也试图在没有collections.sort的情况下这样做。

    public void addCollege(String c){
    String s="";
    for(int i=0; i<=universities.size()-1; i++){
        if(c.equals(universities.get(i)))
            return;
    }
    universities.add(c);
    for(int p=1; p<=universities.size()-1; p++)
        if(universities.get(p-1).compareTo(universities.get(p))>0){
                s=universities.get(p);
                universities.set(p, universities.get(p-1));
                universities.set(p-1, s);

        }
    }

这是测试人员的内容。其中大部分与我的问题无关:

  public class schoolTester {

public static void main(String[] args) {
    School s=new School(1000, "600 Pine Lane", "Pines School", "Bob Smith");
    int[] x={4,4,4,4,4,4};
    Elementary e=new Elementary(2000, "601 Pine Lane", "Everglades", "Bobby Smith", x);
    ArrayList<String>uni=new ArrayList<String>();
    uni.add("Harvard");
    uni.add("MIT");
    uni.add("Georgia Tech");
    uni.add("UCF");
    HighSchool h=new HighSchool(4000, "602 Pine Lane", "hi-school", "bob smith", uni);
    h.addCollege("Berkely");
    h.addCollege("Miami");
    h.addCollege("FSU");
    h.addCollege("FGCU");
    System.out.println(h.getColleges());
    h.addCollege("FSU");
    System.out.println(h.getColleges());

}

}

4 个答案:

答案 0 :(得分:2)

你最好使用TreeMap

它具有防止重复的内置功能,如果您正确实现compareTo方法,请将其中的项目按您希望的方式排序。

答案 1 :(得分:1)

你应该使用TreeSet看下面的代码

public class Test2 {
   public static void main(String[] args) {
    TreeSet<String> uni = new TreeSet();
    // Add elements to the tree set
    uni.add("Harvard");
    uni.add("MIT");
    uni.add("Georgia Tech");
    uni.add("UCF");
    uni.add("600 Pine Lane");
    System.out.println(uni);
  }
}

答案 2 :(得分:0)

必须将所有字符串转换为相同的大小写,然后再运行几次迭代。感谢Jordan Fryar:

  public void addCollege(String c){
    String s="";
    for(int i=0; i<=universities.size()-1; i++){
        if(c.equals(universities.get(i)))
            return;
    }
    universities.add(c);
    for(int t=0; t<universities.size(); t++){
    for(int p=1; p<=universities.size()-1; p++)
        if(universities.get(p-1).compareTo(universities.get(p))>0){
                s=universities.get(p);
                universities.set(p, universities.get(p-1));
                universities.set(p-1, s);

        }
    }
    }

答案 3 :(得分:0)

由于这看起来像是为了学校,我会指出你正确的方向,因为所有编码问题,说:

  1. 将算法细分为(即方法)
  2. 描述性地描述所有内容
  3. 这会给你一个良好的开端。给出单字母变量名称唯一可以得到的就是循环变量,尽管这(按照惯例)通常是i,j或k。

    如果你这样做,将会更容易看到发生了什么。这是我在清理你的代码之后最终得到的结果(尽量不改变算法)。我还没有包含universityAlreadyAdded(String)方法,因为它目前并不重要。

    List<String> universities = new ArrayList<>();
    
    public void addUniversity(String university) {
        if(universityAlreadyAdded(university)) {
            return;
        }
    
        universities.add(university);
    
        siftLastUniversityIntoSortedPosition();
    }
    
    public void siftLastUniversityIntoSortedPosition() {
        for(int p = 1; p <= universities.size() - 1; p++) {
            String currentUni = universities.get(p - 1);
            String nextUni = universities.get(p);
            if(currentUni.compareTo(nextUni) > 0) {
                    swapElementsAtIndices(p - 1, p);
            }
        }
    }
    

    查看siftLastUniversityIntoSortedPosition()方法(至少这是我试图做的那样),你可以看到问题是你要将最后添加的元素筛选到排序位置但是你的for循环正在上升。

    如果没有亲自尝试,也许您可​​以尝试让算法从universities.size() - 1开始并倒数。这意味着您实际上可以将最后一个元素向下移动(因为这是唯一尚未排序的元素)。 因此你的循环将开始:

    for(int p = universities.size() - 1; p >= 0; p--) {
    

    我将剩下的时间留给你试验并完成!