我读了一个包含城市及其人口的文件,我正在尝试使用插入排序按字母顺序对城市进行排序。 问题是它排除了除第一个之外的所有元素。未排序列表中的第一个值保留在排序列表中的索引[0]中。这是代码:
int i, j;
String v;
for (i = 1; i < cities.size()-1; i++)
{
v = cities.get(i);
j = i;
while (cities.get(j-1).compareToIgnoreCase(v) > 0 && j >=2)
{
cities.set(j, cities.get(j-1));
j--;
}
cities.set(j, v);
}
知道什么是错的吗?
谢谢。
答案 0 :(得分:3)
您可能想要for (i = 0; i < cities.size(); i++)
。
访问数组和列表从0开始计数,但列表/数组的实际大小从1开始计算。
示例:要访问大小为1的数组a
的第一个(也是唯一的)元素,您可以使用a[0]
。
答案 1 :(得分:2)
首先,这......
for (i = 1; i < cities.size()-1; i++)
应该是......
for (i = 1; i < cities.size(); i++)
其次,这......
j = i;
应该是......
int j = i - 1;
第三,这......
while (cities.get(j - 1).compareToIgnoreCase(v) > 0 && j >= 2) {
一团糟。在确定值是否实际可访问之前(例如List
是否在j
的范围内)之前,您尝试访问List
中的值,并且可能应该更像。{1}}。 ..
while ((j > -1) && (cities.get(j).compareToIgnoreCase(key) > 0)) {
说了这么多,这意味着cities.set(j, cities.get(j - 1));
需要成为cities.set(j + 1, cities.get(j));
而cities.set(j, v);
需要成为cities.set(j + 1, key);
像...一样的东西。
List<String> cities = new ArrayList<>(25);
cities.add("D");
cities.add("C");
cities.add("B");
cities.add("A");
for (int i = 1; i < cities.size(); i++) {
String key = cities.get(i);
int j = i - 1;
while ((j > -1) && (cities.get(j).compareToIgnoreCase(key) > 0)) {
cities.set(j + 1, cities.get(j));
j--;
}
cities.set(j + 1, key);
}
例如......