【问题标题】:Problem in implementing Sorted List by Array in JavaJava中按数组实现排序列表的问题
【发布时间】:2011-02-08 21:11:25
【问题描述】:

我写的类的add方法似乎有问题。我想用一个数组来做一个SortedList,但我不知道是什么问题。这是我的代码:

public class SortedList {

    private Integer[] elements;
    private int size;
    private int capacity;

    public SortedList(int cap) {

        elements = new Integer[cap];

        if (cap > 0)
        {
            cap = capacity;
        }
        else
            capacity = 10;

    }

    public boolean isEmpty()
    {
        return size == 0;
    }

    public boolean isFull()
    {
        return size == capacity;
    }

    public int size()
    {
        return size;
    }

    public void doubleCapacity()
    {
        capacity = capacity * 2;
    }

    public void add(Integer el)
    {
        if(this.isEmpty())
        {
            elements[0] = el;
            size++;
        }

        else if(this.isFull())
        {
            this.doubleCapacity();
            for(int i = 0; i<this.size(); i++)
            {
                if(el >= elements[i])
                {
                    elements[i+2] = elements[i+1];
                    elements[i+1] = el;
                }

                else
                {
                    elements[i+1] = elements[i];
                    elements[i] = el;
                }
            }
            size++;
        }
        else
        {
            for(int i = 0; i<this.size(); i++)
            {
                if(el >= elements[i])
                {
                    elements[i+2] = elements[i+1];
                    elements[i+1] = el;
                }
                else
                {
                    elements[i+1] = elements[i];
                    elements[i] = el;
                }
            }
            size++;
        }

    }

    public String toString()
    {
        String s = "";
        s = s + "<SortedList[";
        for(int i = 0; i < this.size(); i++)
        {
            s = s + elements[i];
            if(i < this.size()-1)
                s = s + ",";
        }
        s = s + "]>";
        return s;
    }


    public static void main(String[] args)
    {
        SortedList sl = new SortedList(5);
        sl.add(3);
        //sl.add(2);
        sl.add(4);
        sl.add(5);
//      sl.add(6);
        System.out.println(sl.toString());
    }



}

如果我只在列表中添加 2 个整数,我的代码就可以工作,但是当我尝试添加数字 3、4、5 时,我得到 3、5、5...

可能是什么问题?谢谢..

【问题讨论】:

  • 这很好,但我不必这样做。我只是想学习如何使用数组来做到这一点!

标签: java arrays sortedlist


【解决方案1】:

公共类 SortedList {

private Integer[] elements;
private int size=0;
private int capacity;

public SortedList(int cap) {

    elements = new Integer[cap];

    if (cap > 0)
    {
        capacity = cap;
    }
    else
        capacity = 10;

}

public boolean isEmpty()
{
    return size == 0;
}

public boolean isFull()
{
    return size == capacity;
}

public int size()
{
    return size;
}

public void doubleCapacity()
{
    capacity = capacity * 2;
}

public void add(Integer el) throws Exception{
    elements[size] = el;
    size++;
    if(size>capacity){
        throw new Exception("Size Exceeded");
    }
}

public String toString()
{
    sort();
    String s = "";
    s = s + "<SortedList[";
    for(int i = 0; i < this.size(); i++)
    {
        s = s + elements[i];
        if(i < this.size()-1)
            s = s + ",";
    }
    s = s + "]>";
    return s;
}

public void sort(){
    for (int i=0; i <size()-1; i++) {
        if (elements[i] > elements[i+1]) {
            // exchange elements
            int temp = elements[i];
            elements[i] = elements[i+1];
            elements[i+1] = temp;
        }
    }
}

public static void main(String[] args)
{
    try {
        SortedList sl = new SortedList(5);
        sl.add(3);
        //sl.add(2);
        sl.add(6);
        sl.add(5);

// sl.add(6); System.out.println(sl.toString()); } 捕捉(异常前){ Logger.getLogger(SortedList.class.getName()).log(Level.SEVERE, null, ex); } }

}

【讨论】:

    【解决方案2】:

    您的插入代码无效。

    elements[i+1] = elements[i];
    elements[i] = el;
    

    elements[i+1] 的旧值会发生什么变化?

    【讨论】:

    • 我不知道..我必须将它存储在一个变量中?
    • @Nima:插入完成后elements[i+1]应该在哪里结束?
    • 在我要插入的整数之后?
    • @Nima:那么elements[i+2] 应该在哪里结束?
    【解决方案3】:

    我建议对以前的解决方案进行以下更改。如果您只在 toString() 中调用 sort,那么如果您在一行中有多个未排序的元素(现在您可以从 toString() 中删除 sort()),您的列表将很快失序。它本质上是一种快速插入排序,一旦它不能在列表中进行更多交换,它就会死掉。同样,正如 dty 所建议的,更快的选择是使用二进制搜索来查找插入点。

    public void doubleCapacity(){

    capacity = capacity * 2;
    Integer temp[] = new Integer[capacity];
    for (int i = 0; i < size; i++){
        temp[i] = elements[i];
    }
    elements = temp;
    

    }

    public void add(Integer el){

    if(size+1>capacity){
        doubleCapacity();
    }
    elements[size] = el;
    size++;
    sort();
    }
    

    公共无效排序(){

    //Iterates down the list until it's sorted.
    for (int i=size()-2; i >= 0 && (elements[i] < elements[i+1]); i--) {
            // exchange elements
            int temp = elements[i];
            elements[i] = elements[i+1];
            elements[i+1] = temp;
    }
    

    }

    【讨论】:

    • 算了。如果您假设列表已经排序(根据定义,您必须这样做),那么只需使用二进制搜索来查找插入点。
    • 啊,好点dty。你的建议肯定会跑得更快,我忘了。如果您可以使用 Arrays 框架,那么您可以很容易地相应地改变您的值。
    猜你喜欢
    • 2019-08-16
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多