Java ArrayList 字符串选择排序
Java ArrayList String Selection Sort
我正在努力对字符串的 ArrayList 进行选择排序以按字母顺序排列它们。我不知道我做错了什么。但它对我来说不能正常工作。这是我的代码。
ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add("d");
list.add("f");
list.add("c");
System.out.println(list);
int i;
int j;
int minValue;
int minIndex;
for (i=0; i<list.size(); i++) {
System.out.println(list.get(i));
char iLetter = (list.get(i).charAt(0));
int iValue = (int) iLetter;
minValue = iValue;
minIndex = i;
for(j=i; j<list.size(); j++) {
char jLetter = list.get(j).charAt(0);
int jValue = (int) jLetter;
if (jValue < minValue) {
minValue = jValue;
minIndex = j;
}
}
if(minValue < iValue) {
int temp = iValue;
char idx = list.get(minIndex).charAt(0);
int idxValue = (int) idx;
iValue = idxValue;
idxValue = temp;
}
}
System.out.println(list);
}
它仍然打印为 ["a"、"d"、"f"、"c"]
您没有在循环中的任何地方更新 list
,因此它仍未排序。
为了实际交换列表的元素,替换:
if(minValue < iValue) {
int temp = iValue;
char idx = list.get(minIndex).charAt(0);
int idxValue = (int) idx;
iValue = idxValue;
idxValue = temp;
}
与:
if(minValue < iValue) {
Collections.swap (list, i, minIndex);
}
Collections.swap
执行以下修改:
list.set(i, list.set(minIndex, list.get(i)));
现在输出将是
[a, c, d, f]
如前所述,您需要在列表中进行实际交换,而不仅仅是临时变量(doh!)。
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("a");
list.add("d");
list.add("f");
list.add("c");
System.out.println(list);
for (int i = 0; i < list.size(); i++) {
String smallest = list.get(i);
int smallestIndex = i;
for (int j = i; j < list.size(); j++) {
String value = list.get(j);
if (value.compareTo(smallest) < 0) {
smallest = value;
smallestIndex = j;
}
}
if (smallestIndex != i) {
String head = list.get(i);
list.set(i, smallest);
list.set(smallestIndex, head);
}
}
System.out.println(list);
}
此外,您的代码只是一个方法,又名意大利面条代码。为了使其更加面向对象,您可以进行以下更改。
import java.util.*;
public class SelectionSort<T extends Comparable> {
private List<T> values;
public SelectionSort(List<T> values) {
this.values = values;
}
private void sort() {
for (int headIndex = 0; headIndex < values.size(); headIndex++) {
sortFrom(headIndex);
}
}
private void sortFrom(int headIndex) {
int smallestIndex = findSmallestFrom(headIndex);
if (smallestIndex != headIndex) {
swap(headIndex, smallestIndex);
}
}
private int findSmallestFrom(int i) {
int smallestIndex = i;
T smallest = values.get(i);
for (int j = i; j < values.size(); j++) {
T value = values.get(j);
if (value.compareTo(smallest) < 0) {
smallest = value;
smallestIndex = j;
}
}
return smallestIndex;
}
private void swap(int i, int j) {
T head = values.get(i);
values.set(i, values.get(j));
values.set(j, head);
}
public static void main(String[] args) {
List<String> values = createTestData();
System.out.println(values);
SelectionSort selectionSort = new SelectionSort<>(values);
selectionSort.sort();
System.out.println(values);
}
private static List<String> createTestData() {
List<String> values = new ArrayList<>();
values.add("a");
values.add("d");
values.add("f");
values.add("c");
return values;
}
}
我做的一些改动:
- 创建测试数据的单独方法
- 用于打印列表前后状态并调用排序的单独方法
- 创建实例而不只是静态代码
- 将迭代和逻辑分离为有意义的方法
- 将 'list' 变量重命名为 'values'。它是一个列表这一事实已经很清楚了。约定是根据集合包含的数据的含义来命名集合
- 在 class (
<T extends Comparable>
) 上引入了泛型类型变量。这允许对任何类型的数据进行排序,只要它实现了 Comparable 接口
我正在努力对字符串的 ArrayList 进行选择排序以按字母顺序排列它们。我不知道我做错了什么。但它对我来说不能正常工作。这是我的代码。
ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add("d");
list.add("f");
list.add("c");
System.out.println(list);
int i;
int j;
int minValue;
int minIndex;
for (i=0; i<list.size(); i++) {
System.out.println(list.get(i));
char iLetter = (list.get(i).charAt(0));
int iValue = (int) iLetter;
minValue = iValue;
minIndex = i;
for(j=i; j<list.size(); j++) {
char jLetter = list.get(j).charAt(0);
int jValue = (int) jLetter;
if (jValue < minValue) {
minValue = jValue;
minIndex = j;
}
}
if(minValue < iValue) {
int temp = iValue;
char idx = list.get(minIndex).charAt(0);
int idxValue = (int) idx;
iValue = idxValue;
idxValue = temp;
}
}
System.out.println(list);
}
它仍然打印为 ["a"、"d"、"f"、"c"]
您没有在循环中的任何地方更新 list
,因此它仍未排序。
为了实际交换列表的元素,替换:
if(minValue < iValue) {
int temp = iValue;
char idx = list.get(minIndex).charAt(0);
int idxValue = (int) idx;
iValue = idxValue;
idxValue = temp;
}
与:
if(minValue < iValue) {
Collections.swap (list, i, minIndex);
}
Collections.swap
执行以下修改:
list.set(i, list.set(minIndex, list.get(i)));
现在输出将是
[a, c, d, f]
如前所述,您需要在列表中进行实际交换,而不仅仅是临时变量(doh!)。
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("a");
list.add("d");
list.add("f");
list.add("c");
System.out.println(list);
for (int i = 0; i < list.size(); i++) {
String smallest = list.get(i);
int smallestIndex = i;
for (int j = i; j < list.size(); j++) {
String value = list.get(j);
if (value.compareTo(smallest) < 0) {
smallest = value;
smallestIndex = j;
}
}
if (smallestIndex != i) {
String head = list.get(i);
list.set(i, smallest);
list.set(smallestIndex, head);
}
}
System.out.println(list);
}
此外,您的代码只是一个方法,又名意大利面条代码。为了使其更加面向对象,您可以进行以下更改。
import java.util.*;
public class SelectionSort<T extends Comparable> {
private List<T> values;
public SelectionSort(List<T> values) {
this.values = values;
}
private void sort() {
for (int headIndex = 0; headIndex < values.size(); headIndex++) {
sortFrom(headIndex);
}
}
private void sortFrom(int headIndex) {
int smallestIndex = findSmallestFrom(headIndex);
if (smallestIndex != headIndex) {
swap(headIndex, smallestIndex);
}
}
private int findSmallestFrom(int i) {
int smallestIndex = i;
T smallest = values.get(i);
for (int j = i; j < values.size(); j++) {
T value = values.get(j);
if (value.compareTo(smallest) < 0) {
smallest = value;
smallestIndex = j;
}
}
return smallestIndex;
}
private void swap(int i, int j) {
T head = values.get(i);
values.set(i, values.get(j));
values.set(j, head);
}
public static void main(String[] args) {
List<String> values = createTestData();
System.out.println(values);
SelectionSort selectionSort = new SelectionSort<>(values);
selectionSort.sort();
System.out.println(values);
}
private static List<String> createTestData() {
List<String> values = new ArrayList<>();
values.add("a");
values.add("d");
values.add("f");
values.add("c");
return values;
}
}
我做的一些改动:
- 创建测试数据的单独方法
- 用于打印列表前后状态并调用排序的单独方法
- 创建实例而不只是静态代码
- 将迭代和逻辑分离为有意义的方法
- 将 'list' 变量重命名为 'values'。它是一个列表这一事实已经很清楚了。约定是根据集合包含的数据的含义来命名集合
- 在 class (
<T extends Comparable>
) 上引入了泛型类型变量。这允许对任何类型的数据进行排序,只要它实现了 Comparable 接口