[英]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.