2015-02-10 175 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--) { 

我將離開,其餘爲你試驗與玩完!