2016-02-07 114 views
-3

我正在實現一個簡單的排序類,並想知道如何使用while循環而不是do-while循環來實現此操作。Java使用while循環轉換do-while循環

外部循環對「名稱」列表中的每個項目執行一次。但是,它是一個do-while循環,它總是至少執行一次。如果「名稱」是空列表,這將導致錯誤的結果。它應該被替換爲一個while循環。

Sort類

public class Sort { 

public static ArrayList<Name> sort1(ArrayList<Name> names) { 

    ArrayList<Name> results; 

    results = new ArrayList<Name>(); 

    int count = names.size(); 
    do { 

     Name firstName = new Name("zzz", "zzz"); 
     for (Name name : names) { 
      if (name.getFirstName().compareTo(firstName.getFirstName()) < 0 
        || name.getFirstName().equals(firstName.getFirstName()) 
          && name.getSurName().compareTo(firstName.getSurName()) < 0) { 
       firstName = new Name(name.getFirstName(), name.getSurName()); 
      } 
     } 

     results.add(firstName); 

     names.remove(firstName); 

     count--; 

    } while (count > 0); 

    return results; 
}}} 

名稱類

class Name { 

String firstName; 
String surName; 

public Name() { 
} 

public Name(String firstName, String surName) { 

    this.firstName = firstName; 
    this.surName = surName; 
} 

public String getFirstName() { 
    return firstName; 
} 

public void setFirstName(String firstName) { 
    this.firstName = firstName; 
} 

public String getSurName() { 
    return surName; 
} 

public void setSurName(String surName) { 
    this.surName = surName; 
} 

public String toString() { 
    return firstName + " " + surName; 
} 

public boolean equals(Object other) { 
    String fname = ((Name) other).firstName; 
    String sname = ((Name) other).surName; 
    if (firstName.equals(fname) && surName.equals(sname)) { 
     return true; 
    } else { 
     return false; 
    } 
} 
+2

嗯?只需使用'while(count> 0)'?或者我誤解了你? – Ctx

+1

for循環如何?對於(int count = names.size(); count> 0; count--){...} – Andreas

+0

正如其他人所說的,只需用while循環(或for循環)替換do-while循環即可。另外,你應該閱讀你的Name類的[如何編寫正確的equals方法](http://www.javaranch.com/journal/2002/10/equalhash.html)。最後,爲你的Name類編寫一個'compareTo'方法是有意義的,這會讓你的排序方法中的for-loop變得更簡單。 –

回答

0
public class Sort { 

private static void doIterate(List<Name> names, List<Name> results) { 
     Name firstName = new Name("zzz", "zzz"); 
     for (Name name : names) { 
      if (name.getFirstName().compareTo(firstName.getFirstName()) < 0 
        || name.getFirstName().equals(firstName.getFirstName()) 
          && name.getSurName().compareTo(firstName.getSurName()) < 0) { 
       firstName = new Name(name.getFirstName(), name.getSurName()); 
      } 
     } 

     results.add(firstName); 

     names.remove(firstName); 
} 

public static ArrayList<Name> sort1(ArrayList<Name> names) { 

    ArrayList<Name> results; 

    results = new ArrayList<Name>(); 

    int count = names.size(); 
    doIterate(names, results); 
    count--; 
    while (count > 0) { 
     doIterate(names, results); 
     count--; 
    } 

    return results; 
}}} 
+0

謝謝,這非常有幫助。好想法。 – huskyprogrammer

+0

這個仍然至少執行一次迭代(它會在while循環之外調用迭代),所以它仍然不適用於空列表。 –

0

由於while循環總是執行一次,我會做之前的循環檢查,看看名字有值在裏面。如果是,則執行do/while循環。否則,跳過它。

2

只需用您的while (count > 0)替換do即可。