Java 排序算法不工作

Java 排序算法不工作,java,generics,sorting,set,Java,Generics,Sorting,Set,我需要在向泛型类添加对象时按升序排序(我使用的是字符串) 我正在使用选择排序,但它不起作用 我不知道这是否是正确的方法,所以我非常感谢您的意见 订单集类 公共类OrderSet实现了{ 私人物品; 私有整数大小; 公共命令集() { 项目=(T[])新的可比项目[5]; } @凌驾 公共无效添加(TS) { 如果(尺寸>=项目长度) { 项目=增长(项目); } 对于(int i=0;i1) { 对于(int i=0;i

我需要在向泛型类添加对象时按升序排序(我使用的是字符串)

我正在使用选择排序,但它不起作用

我不知道这是否是正确的方法,所以我非常感谢您的意见

订单集类
公共类OrderSet实现了{
私人物品;
私有整数大小;
公共命令集()
{
项目=(T[])新的可比项目[5];
}
@凌驾
公共无效添加(TS)
{
如果(尺寸>=项目长度)
{
项目=增长(项目);
}
对于(int i=0;i1)
{
对于(int i=0;i0比较
{
tmp=项目[i];
项目[i]=项目[j];
项目[j]=tmp;
}                    
}                
}
}
}
@凌驾
公开展览(
{        
对于(TA:项目)
{ 
如果(a!=null)
系统输出打印(a+“,”);
}
}
公共T[]增长(T[]a)
{
T[]newA=(T[])新可比[a.长度+5];
数组复制(a,0,newA,0,a.length);
返回纽瓦;
}
}
主要的
公共类主{
公共静态void main(字符串[]args)引发IOException
{
OrderSet s1=新的OrderSet();
WordCount s2=新的WordCount();
扫描仪输入=新扫描仪(“男孩在公园里和狗玩”);
while(input.hasNext())
{
字符串w=input.next();
s1.加入(w);
}
s1.show();
System.out.println();
} 
}

当您添加项目时,您似乎在做气泡排序,选择排序的一般形式如下所示:

for(int i = 0; i<arr.length - 1; i++)
{
   int smallest = i;
   for(int j = i + 1; j< arr.length; j++)
   {
       if(arr[j].compareTo(arr[smallest]) > 0)
           smallest = j;
   }
   if(smallest < arr.length && smallest != i)
       swap(arr[i], arr[smallest]);
}
for(int i=0;i 0)
最小=j;
}
if(最小

您可以将最大的索引替换为最后一个索引,但这也应该起作用。注意,交换只是实际交换的占位符伪代码。

我认为是您的排序算法错了。Ardentsonata是对的,您使用的是Bubblesort算法,但有一个错误:

for (int i = 0; i < size-1; i++) {
    for(int j = 1; j < size; j++){
        T tmp;
        if (items[i].compareTo(items[j]) > 0) {
            tmp = items[i];
            items[i] = items[j];
            items[j] = tmp;
        }                    
    }                
}
for(int i=0;i0比较{
tmp=项目[i];
项目[i]=项目[j];
项目[j]=tmp;
}                    
}                
}
问题是第二个循环的起始值,您需要检查是否有任何其他元素(已排序的元素除外)大于当前要排序的元素。 所以你的第二个循环需要这个头部:

for(int j = (i+1); j < size; j++)
for(int j=(i+1);j
所以你要对数组进行排序

否则,您就无法控制值的切换,因为在您将某些内容切换到第二个插槽之后,您会在下一次迭代中将其切换回来


希望有帮助

使用java.util.TreeSet,它实现了排序集

在这种情况下最好使用字符串比较概念

class City {

public static void main (String args[])
{ 
int i,j;
String temp;
String s[] = new String[6];
for(i=0; i<6; i++)
 s[i]=args[i];
for(i=0;i<6;i++){
  for(j=0;j<6-i-1;j++){
 if(s[j].compareTo(s[j+1])>0)
 {
   temp=s[j];
   s[j]=s[j+1];
   s[j+1]=temp;
 } 
}
 }
 for(i=0; i<6; i++)
 {
 System.out.println(s[i]);
}
}}
class城市{
公共静态void main(字符串参数[])
{ 
int i,j;
字符串温度;
字符串s[]=新字符串[6];

对于(i=0;iIs)您这样写是有原因的吗?一种更简单的方法是将字符串添加到列表中,然后使用Collection.sort()对其进行排序。有两种sort()方法,其中一种方法使用比较器,因此您可以按您喜欢的任何方式进行排序。为此,我必须更改类型为T[]的数组而是…使用一个列表。这就是你的意思吗?
T扩展可比较的
不保证
items[i]。compareTo(items[j])
会起作用。使用原始类型是不好的。你应该使用
T extends comparable为什么不能保证起作用?@miatech,看这个:,这就是泛型非常危险的原因,你必须非常小心你的键入。
for(int j = (i+1); j < size; j++)
class City {

public static void main (String args[])
{ 
int i,j;
String temp;
String s[] = new String[6];
for(i=0; i<6; i++)
 s[i]=args[i];
for(i=0;i<6;i++){
  for(j=0;j<6-i-1;j++){
 if(s[j].compareTo(s[j+1])>0)
 {
   temp=s[j];
   s[j]=s[j+1];
   s[j+1]=temp;
 } 
}
 }
 for(i=0; i<6; i++)
 {
 System.out.println(s[i]);
}
}}