簡體   English   中英

抽象數據類型,按列表中的特定變量對對象進行排序

[英]Abstract Data Types, sorting objects by specific variable in a list

好了,我們開始吧。

我以sortedArrayList的形式制作了ADT,它具有如下所示的add方法:

public boolean addToArray(T i)
    {


            int insertPlace = 0;

                for(int j=0;j<size;j++)
                { 

                    if(i.compareTo(sortedArray[j])<0)
                    {
                        insertPlace =j;
                        j = size;
                    }
                }
                if(size>0)
                {


                        for(int w=size-1; w>=insertPlace;w--)
                        {
                                sortedArray[size]=sortedArray[w];
                        }
                        sortedArray[insertPlace]=i;
                }
                else
                {
                    sortedArray[0]=i;
                }
                size++;



        return true;    


}

現在,當輸入為Strings時,這對我排序的ADT產生了奇跡。 但是,我想以Persons的形式向列表中添加對象,而不是字符串,該對象包含4個變量(String Country,String name,int age,int CPR)。 我希望Person對象按年齡在列表中排序。

這是Person類,帶有compareTo方法進行排序。

public class Person implements Comparable<Person>
{
    int cpr=200193;
    int age=21;
    String name="John Doe";
    String Country="Uzbekistan";


    public Person() {
        this.cpr=cpr;
        this.age=age;
    }
    public Person(String name, String Country,int cpr,int age) 
    {
        this.cpr=cpr;
        this.age=age;
        this.name=name;
        this.Country=Country;
    }


    @Override
    public String toString()
    {
        return "Person [Country= " + Country + ", Name:" + name + ", Cpr: "+cpr+ ", age: "+age+"]";
    }

    public int compareTo(Person p)
    {
        int before=-1;
        int after=1;
        int middle=0;


        if(this.age!=p.age)
        {
            if(this.age>p.age) 
            {
                return before;
            } 

            if(this.age<p.age)
            {
                return after;
            }
        }
        return middle;
    }

現在,問題在於對象已排序,因為它們的出現順序與我將它們稱為列表的順序不同。 我只是不知道如何對它們進行排序,以及如何使對象按年齡在列表中排序。

編輯

p1.addToArray(new Person());
p1.addToArray(new Person("Pete","Germany",111111,86));
p1.addToArray(new Person("John","Denmark",123456,75));
p1.addToArray(new Person("Michael Jackson", "America",112345,49));

輸出:

Item: Person [Country= America, Name:Michael Jackson, Cpr: 112345, age: 49]
Item: Person [Country= Uzbekistan, Name:John Doe, Cpr: 200193, age: 21]
Item: Person [Country= Germany, Name:Pete, Cpr: 111111, age: 86]
Item: Person [Country= Denmark, Name:John, Cpr: 123456, age: 75]

我認為您的排序功能不起作用:

我的測試:

static void test() {
    addToArray("Zello");
    addToArray("Boby");
    addToArray("Amy");
    addToArray("Coco");
    addToArray("Boris");
    for(int i = 0; i < size; i++) {
        System.out.println(sortedArray[i]);
    }
}

輸出:

Amy
Boris
Boby
Zello
Coco

這是一種不同且更有效的方法。

使用Arrays.binarySearch()查找正確的插入位置。 請注意,此函數返回:

  • 值的索引(如果已存在)。
  • -(insertPosition - 1)如果該值不存在。

我根據您的代碼假定size變量表示數組中最后一個元素的索引。 這意味着您可能在數組為空時將其初始化為-1。

此外,我認為您不允許重復,並且每個Person都是唯一的,因此當您嘗試插入重復項時,我的解決方案將返回false。

當然,請確保在滿足某些條件后調整數組的大小(通常是在數組已滿的情況下)。

public boolean addToArray(T item) {

    if (item == null) {
        return false;
    } else if (size == -1) {
        size++;
        sortedArray[size] = item;
        return true;
    } else {

        // find the correct insertion point using Binary Search
        int insertionPoint = Arrays
                .binarySearch(sortedArray, 0, size+1, item);

        if (insertionPoint >= 0) {
            // duplicate value
            return false;
        }

        // set the insertionPoint to proper value
        insertionPoint = (-(insertionPoint) - 1);

        // shift elements to the right of insertionPoint
        for (int i = size + 1; i > insertionPoint; i--) {
            sortedArray[i] = sortedArray[i - 1];
        }

        // insert at insertionPoint
        sortedArray[insertionPoint] = item;

        // update size
        size++;

        return true; //success
    }
}

同樣,您可以進一步簡化Person對象中的compareTo( )方法。

public int compareTo(Person p) {
    if(p != null) {
            return p.age - this.age;
    } else throw new NullPointerException();
}

現在,排序正在下降。 如果要使其升序,請更改:

return p.age - this.age;

至:

return this.age - p.age;

這是一個完整的示例

示例輸出(升序排列):

Person [Country= Uzbekistan, Name:John Doe, Cpr: 200193, age: 21]
Person [Country= America, Name:Michael Jackson, Cpr: 112345, age: 49]
Person [Country= Denmark, Name:John, Cpr: 123456, age: 75]
Person [Country= Germany, Name:Pete, Cpr: 111111, age: 86]

要對ArrayList進行排序,可以在需要對其進行排序的地方使用類集合import java.util.Collections; Collections.sort(yourArrayList); import java.util.Collections; Collections.sort(yourArrayList);

方法排序需要您已經實現的Person類中的compareTo方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM