java - Java 冒泡排序字符串 ArrayList 对象
问题描述
有人可以找到为什么这没有被排序我似乎无法找到我有什么问题吗?正在显示的输出是我如何依次输入它们,因此排序方法不起作用......
// Sorting Ticket by Alphabetic Order - Method
public void SortTicket() {
boolean valid = true;
for (int i = 0; i < tList.size(); i++) {
valid = false;
Ticket t1 = (Ticket) tList.get(i);
Ticket t2 = (Ticket) tList.get(i++);
if (t1.GetSurname().compareTo(t2.GetSurname()) > 0) {
tList.remove(t1);
tList.add(i++, t1);
valid = true;
}
}
for (int i = 0; i < tList.size(); i++) {
Ticket tmpTick = (Ticket) tList.get(i);
System.out.println(tmpTick.ToString());
}
}
解决方案
存在三个错误:
1. 它i++
代替i+1
. i++
意思是:返回i
然后增加它的值。所以t1
和t2
是相同的元素。
2. 它运行列表的完整扫描,同时它应该停止tList.size()-1
以避免IndexOutOfBoundsException。
3. 这不是真正的冒泡排序。你需要两个循环。
此外,您从不使用valid
,因此应将其删除。如果列表已经排序,我将其替换为 true 的标志。
public void SortTicket()
{
int size = tList.size();
int end = size-1; // size-1, so you don't get an IndexOutOfBoundsException
boolean sorted = false;
for(int i = 0; i < size-1 && !sorted; i++)
{
sorted = true; // if you never execute a swap, the list is already sorted
for (int j=0; j<end; j++) {
Ticket t1 = (Ticket) tList.get(j);
Ticket t2 = (Ticket) tList.get(j+1); // j+1, so you don't change the value of i
if(t1.GetSurname().compareTo(t2.GetSurname()) > 0)
{
sorted = false;
tList.remove(j);
tList.add(j+1, t1); // j+1, so you don't change the value of i
}
}
end--;
}
for(int i = 0; i<size; i++)
{
Ticket tmpTick = (Ticket) tList.get(i);
System.out.println(tmpTick.ToString());
}
}
最后,如果您使用泛型,您可以将 tList 声明为List<Ticket> tList
. 这样您就不需要强制转换由list.get(index)
.
推荐阅读
- angular - 如何从 Angular 服务接收来自 ASP.NET Core Web API 的文件并在不同的 chrome 选项卡中显示
- html - div 仅在 CSS 动画开始时在移动设备上消失
- python - Plotting Right extended horizontal line matplotlib
- c++ - Visual Studio 和 MinGW 制作的 DLL 有什么区别?
- python - IF ELSE 语句每 3 分钟运行一次
- r - insert column names in dplyr
- sql-server - 如何使用 Azure 机器学习笔记本连接到 SQL Server 和 Azure SQL 数据库?
- python - Plotly Express 条形图类型错误:无法连接非 NDFrame 对象
- regex - 正则表达式 - 从捕获中间排除“1”或“11”
- python - 在timeit python模块中带有单行while循环的SyntaxError