将项添加到有序集中的数组的问题

时间:2011-05-29 21:59:55

标签: java arrays set add sortedset

我在向数组添加项目时遇到问题,应该按升序排序,出于某种原因我只是添加它并且没有订购它。

这是我的代码:

public boolean add(AnyType x){
    if(this.contains(x))
        return false;
    else if(this.isEmpty()){
        items[theSize]=x;
        theSize++;
        return true;
    }
    else{
    if( theSize == items.length )
        this.grow();
    //Here goes code for adding
    /*AnyType[] newItems = (AnyType[]) new Comparable[items.length];
    newItems = items;
    for(int i=0;i<theSize;i++)
        if(items[i].compareTo(x)>0){
            newItems[i]=x;
            newItems[i+1]=items[i];
            for(int j=i+1;j<theSize;j++)
                newItems[j]=items[i];
            items = newItems;
            theSize++;
            return true;
        }

    //*/
    items[theSize]=x; //*/
    theSize++;
    return true;
    }
}

该方法不应允许项重复,因此如果您尝试添加已存在的内容,则应返回false。如果数组是空的,只需添加到items [0],然后我尝试创建一个新数组,一旦你发现一个项目大于我输入的项目将所有内容复制到一个新数组中,添加新值,然后添加其余的然后制作items = newItems;但它没有用。我已经尝试了几个小时,所以我决定寻求帮助。 我的SortedSet类定义如下:

public class SortedSet<AnyType extends Comparable> implements Set<AnyType>
{
    private AnyType[] items;
    private int theSize;
    public SortedSet(){
        theSize = 0;
        items = (AnyType[]) new Comparable[5];
    }

我知道还有其他方法可以像使用TreeMap一样,但必须以数组的形式完成。

由于

3 个答案:

答案 0 :(得分:2)

我没看到你在写下以前的值?

在最后的其他地方尝试这样的事情。

            theSize++;
            AnyType[] newItems = new AnyType[theSize];
            for(int i = 0; i < theSize-1; i++)
                if(items[i].compareTo(x) > 0)
                {
                    newItems[i] = x;
                    newItems[i + 1] = items[i];
                    for(int j = i + 2; j < theSize; j++)
                        newItems[j] = items[j-1];
                    items = newItems;
                    return true;
                }
                else
                    newItems[i] = items[i];
            newItems[theSize-1] = x;
            items = newItems;
            return true;

由于我已对其进行编码以确保其正常工作,因此这里有一个处理字符串的示例。我只关注正确的添加。其他对OP很重要的问题被省略了。

import java.util.Arrays;

public class OrderingAddTest
{
    static int theSize = 0;
    static String[] items = new String[theSize];
    public static void main(String[] args)
    {
        add("a");
        add("e");
        add("d");
        add("b");
        add("c");

        System.out.println(Arrays.toString(items)+"\n; items.length="+items.length);
    }

    private static boolean add(String x)
    {
        theSize++;
        String[] newItems = new String[theSize];
        for(int i = 0; i < theSize - 1; i++)
            if(items[i].compareTo(x) > 0)
            {
                newItems[i] = x;
                newItems[i + 1] = items[i];
                for(int j = i + 2; j < theSize; j++)
                    newItems[j] = items[j - 1];
                items = newItems;
                return true;
            }
            else
                newItems[i] = items[i];
        newItems[theSize - 1] = x;
        items = newItems;
        return true;
    }
}

答案 1 :(得分:1)

已经有一个本机Java类具有以下功能:java.util.TreeSet。

在Set中,相同的元素不能出现两次。 “add”方法返回一个布尔值:如果添加了项,则返回true;如果已经在集合中,则返回false。

TreeSet是“SortedSet”的实现,它维护元素的顺序。您的物品只需实施“可比较”。

答案 2 :(得分:1)

您的商品尺寸与商品尺寸相同,应为尺寸+ 1

我猜你在这里遇到了问题

for(int j = i + 1; j&lt; theSize; j ++)

newItems [J] =项[I];

这里j肯定会递增,但是没有给出i的递增操作,所以这个循环中的所有newitems都被分配了相同的值


编辑:

    int i;

    for(i=0; i < theSize+1 ; i++)
    if(items[i].compareTo(x)>0){
    newItems[i]=x;

    for(;i<theSize + 1; i++)
     newItems[i]=items[i-1];

:做下一步。

编辑2:

你这里也做错了,

items = newItems;

和之前的赋值语句(newItems = items)

你不能将它们等同,因为它们的大小不同,如果使用Pointer,你可以这样做(在这里使用指针会使这个任务变得更容易),