0

当我将对象添加到我的泛型类(我正在使用字符串)时,我需要按升序排序。

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

我不知道这是否是正确的做法,所以会很感激你的意见。

订单集类

public class OrderSet<T extends Comparable> implements Set<T> {

    private T[] items;
    private int size;

    public OrderSet()
    {
        items = (T[]) new Comparable[5];        
    }

    @Override
    public void add(T s)
    {
        if(size >= items.length)
        {
            items = grow(items);
        }

        for(int i = 0; i < items.length; i++) 
        {
            if(items[i] == null)
            {
                items[i] = s;
                size++;
                break;
            }
        }

        if(size > 1)
        {
            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;
                    }                    
                }                
            }
        }
    }

    @Override
    public void show()
    {        
        for(T a : items)
        { 
            if(a != null)
                System.out.print(a+", ");            
        }
    }

    public T[] grow(T[] a)
    {
        T[] newA = (T[]) new Comparable[a.length+5];
        System.arraycopy(a, 0, newA, 0, a.length);
        return newA;
    }

}

主要的

public class Main {

    public static void main(String[] args) throws IOException
    {
        OrderSet<String> s1 = new OrderSet<>();
        WordCount s2 = new WordCount();

        Scanner input = new Scanner("the boy plays in the park with dog");
        while (input.hasNext()) 
        {
            String w = input.next();
            s1.add(w);
        }

        s1.show();

        System.out.println();
    } 
}
4

4 回答 4

1

您似乎在做的是添加项目时的冒泡排序,选择排序的通用形式如下:

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]);
}

您可以将最大的索引交换到最后一个索引,但这也应该有效。请注意,交换只是实际交换的占位符伪代码。

于 2012-07-10T22:42:52.917 回答
1

我认为这是你的排序算法是错误的。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 j = (i+1); j < size; j++)

所以你真的对数组进行了排序。

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

希望有帮助!

于 2012-07-10T22:51:56.473 回答
0

使用java.util.TreeSet< T >,它实现了SortedSet< T >

于 2012-07-10T22:56:58.100 回答
0

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

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]);
}
}}
于 2012-08-25T07:42:53.107 回答