所以我正在为我的课程开发一个项目,目前我仍然在创建一个QuickSort类来对1000个名字的数组进行排序。我有一个模板,我正在使用我们在课堂上做的一个实验室,我们应该将它作为基础;但是在实验室中我们使用了一个整数数组,我正在努力解决它如何转换它以便它可以与字符串一起使用;名。感谢您的帮助或任何建议,代码如下。
更新后的帖子;所以我在我的Name类中进行了比较
public int compareTo(Object other) {
int result;
if (name.equals(((Name) other).name))
result = name.compareTo(((Name) other).name);
else
result = name.compareTo(((Name) other).name);
return result;
}
我试图重新使用我的QuickSort ..我正在努力使用交换方法。
private ArrayList<Name> data;
public QuickSort(ArrayList<Name> initialValue){
data=initialValue;
}
public void sort(ArrayList<Name> namelist, int i, int j){
sort(0, data.size()-1);
}
public void sort(int from, int to){
if (from >= to)
return;
int p = partition(from, to);
sort(from, p);
sort( p + 1, to);
}
private int partition(int from, int to){
Name pivot = data.get(from);
int i = from - 1;
int j = to + 1;
while(i<j){
i++; while(data.get(i).compareTo(pivot) < 0) i++;
j--; while(data.get(j).compareTo(pivot) < 0) j--;
if(i<j) swap(i,j);
}
return j;
}
private void swap (int i, int j){
Name temp = data.get(i);
data.equals(i) = data.get(j);
data = temp;
}
特别是“data.equals(i)= data.get(j)行和data = temp;我确信我做的事情很愚蠢。
更新
private void swap (int i, int j){
Name temp = data.get(i);
data.get(j).equals(data.get(i));
data.get(j).equals(temp);
}
可能?
答案 0 :(得分:1)
发布解决问题的代码很容易,但不会帮助您了解QuickSort(或其他排序算法)的含义。
QuickSort的核心是在这里交换元素:
while(i<j){
i++; while(data[i] < pivot) i++;
j--; while(data[j] > pivot) j--;
if(i<j) swap(i,j);
}
如您所见,您正在将data
数组的元素与pivot
变量进行比较。由于他们是int
,您可以使用<
轻松比较它们。现在,您必须为String
s做类似的事情。值得庆幸的是,String
可以使用String#compareTo
方法进行比较。我将为String
提供此实现(否则我会将作业分配为我的= P)。
要获得更通用的问题解决方案,您有两种选择:
让您的类实现Comparable
接口,因此您将拥有compareTo
方法。一个基本的
样本实施:
public class Name implements Comparable<Name> {
@Override
public int compareTo(Name name) {
return ... //comparison logic...
}
}
在QuickSort中使用它
pivot.compareTo(...);
使用Comparator
接口的实例。您将使用Comparator#compare
。一个基本的示例实现:
public class NameComparator implements Comparator<Name> {
@Override
public int compare(Name name1, Name name2) {
return ... //comparison logic...
}
}
在QuickSort中使用它
NameComparator nameComparator = new NameComparator();
nameComparator.compare(..., ...);
答案 1 :(得分:0)
您可以使用比较器:如果对象较小,相等或更大,Comparator.compare(o1,o2)将返回-1,0或1。
java中的字符串实际上是可比的,某种伴随接口:
int compareTo(T other);
API执行:http://docs.oracle.com/javase/6/docs/api/java/lang/Comparable.html
答案 2 :(得分:0)
请注意,字符串比较是通过equals方法:
data.get(j) == pivot => data.get(j).equals(pivot)
答案 3 :(得分:0)
您必须设置一个String值才能将其与某些内容进行比较。因此,通过设置枢轴值以将其与自身进行比较,它将返回零。由于所有字符串不太可能等于您的透视值,因此与透视值相比的任何内容都将返回为-1或1.通过执行此操作,您的if语句将确定交换值的发送方式(更高或更低)然后您的支点值。
ObjectQuickSorter sortStrings = new ObjectQuickSorter();
sortStrings.sort(arrayHere);
class ObjectQuickSorter{
void sort(String[] array){
doQuickSort(array, 0, array.length -1);
}
private static void doQuickSort(String[] array,int start, int end){
int pivotPoint;
if(start < end){
pivotPoint = partition(array, start, end);
doQuickSort(array, start, pivotPoint -1);
doQuickSort(array, pivotPoint + 1, end);
}
}
private static int partition(String[] array, int start, int end){
String pivotValue;
int endOfLeftList;
int mid = (start + end)/2;
swap(array, start, mid);
pivotValue = array[start];
endOfLeftList = start;
for(int scan = start + 1; scan <= end; scan++){
// trying to compare pivot = string value to array[scan] position value
// doing this by setting pivot value compare to itself to return 0
// then also comparing pivot value to array[scan] to return -1, 0, 1
// if return is 0 or 1 then it ignores it
if( array[scan].compareTo(pivotValue) < array[start].compareTo(pivotValue)){
endOfLeftList++;
swap(array, endOfLeftList,scan);
}
}
swap(array, start, endOfLeftList);
return endOfLeftList;
}
private static void swap(String[] array, int a, int b){
String temp;
temp = array[a];
array[a] = array[b];
array[b] = temp;
}
}