2015-02-10 178 views
1

我正在写一个叫做HighSchool的类,它有一个名为大学的弦乐阵列。我的目标是创建一个名为addCollege(String c)的方法,该方法接受字符串,检查列表,然后只要字符串已经不在列表中,就按正确的字母顺序排列。这是迄今为止我所做的,但它只是列表的第一部分。我也试图做这个没有collections.sort。将字符串添加到arraylist按顺序

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()); 

} 

}

+0

我假设这是学校,排除List.Contains()以及? 有一件事我会开始 - 比较名称时,添加一个toUpper()两个 - 或equalsIgnoreCase(),以防万一他们在不同情况下进来 – Neverwork2123 2015-02-10 04:51:51

+0

好主意。我注意到java在处理不同情况时可能会感到困惑。 – jeff98 2015-02-10 05:03:12

+0

而不工作的原因是,你试图通过阵列只使用一个扫描排序 假设你不想递归做它,添加一段时间 flag = 1; while(flag == 1){ 您的排序循环在这里 如果更改设置标志为1,否则为0} – Neverwork2123 2015-02-10 05:05:10

回答

2

你与TreeMap更好。

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

0

不得不将所有的字符串转换为相同的大小写,然后再运行一些我的排序。感谢乔丹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); 

     } 
    } 
    } 
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); 
    } 
} 
0

因为这看起来是对学校,我会为你在正确的方向,所有的编码问题,说:

  1. 打破你的算法为部分(即方法)
  2. 将名字一一描述

只是这会给你一个良好的开端。给出一个单字母变量名称唯一可以避免的就是你的循环变量,尽管这个(按照惯例)通常是一个i,j或者k。

如果你这样做会更容易看到发生了什么。这是我清理了一下你的代码之后最后的结果(试图不改变算法)。我也没有包括universityAlreadyAdded(String)方法,因为此刻它不重要。在siftLastUniversityIntoSortedPosition()方法

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); 
     } 
    } 
} 

展望(至少这是它在我看来,你试图做),你可以看到,问题是你要最后添加的元素过筛到排序的位置,但你for循环正在上升。

没有真正尝试它自己,也许你可以尝试让你的算法从universities.size() - 1开始,并倒计时。这意味着你可以实际转移最后一个元素(因为这是尚未排序的唯一元素)。 因此你的循环就开始:

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

我将离开,其余为你试验与玩完!