2016-02-07 113 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即可。