2014-09-10 33 views
1

好的,我们开始吧。抽象数据类型,按列表中的特定变量对对象进行排序

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;  


} 

现在,这个工作对我的分类ADT奇观当输入字符串:

我在sortedArrayList,它有一个add方法看起来像这样的形式做出了ADT。然而,我想以字符串的形式将对象添加到列表中,而对象包含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] 
+0

您可以使用'return Integer.compare(this.age,p.age)'而不是'compareTo'方法中的所有行,但这只是在您发现问题出在哪里之后。您是否尝试过使用'Collections.sort'而不是手动排序列表? – Chronicle 2014-09-10 19:13:37

+0

我们可以看到错误排序的数组如何看起来像其中的几个人? – MirMasej 2014-09-10 19:14:08

+0

@MirMasej是的,我会做一个编辑,告诉你我添加了什么以及它的输出。 – Alexandermeyeer 2014-09-10 19:16:52

回答

1

我不认为你的排序功能的工作原理:

我的测试:

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; 

这里是一个full running example

实例输出(带有升序排序):

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] 
+0

我已经尝试过,不幸的是它并没有解决问题。感谢你及时的答复。 – Alexandermeyeer 2014-09-10 19:10:20

+0

@Alexandermeyeer查看我的编辑答案 – nem035 2014-09-10 20:03:34

+0

它现在的作品,由于深思熟虑的解释,从未使用二进制搜索,但现在我看到了这样做的效率。 – Alexandermeyeer 2014-09-10 20:40:42

0

要对ArrayList进行排序,您可以使用需要对其进行排序的类集合 import java.util.Collections; Collections.sort(yourArrayList);

sort方法需要您已经实现的类Person中的方法compareTo。

+0

不幸的是,它不起作用,因为它是我自己使用实例化的数据类型。 – Alexandermeyeer 2014-09-10 19:32:32

相关问题