2011-04-04 164 views
0

添加應該是一個被按照字母順序放置在數組列表中的字符串,但是每當我執行程序時,Arraylist總是按照我添加它的順序。被覆蓋的添加不起作用

這裏的測試:

import java.util.*; 
public class Test 
{ 
    private static ArrayList x=new ArrayList(); 
    private static ArrayList<String> li=new ArrayList<String>(); 
    private static SortedList s=new SortedList(); 
    // private static Person p[]=new Person[4]; 
    // private static Fraction f[]=new Fraction[5]; 

    public static void main(String args[]) 
    { 
     //number 1 
     x.add(5); 
     x.add(6); 
     x.add(1.5); 
     x.add(7); 
     x.add(2.5); 
     System.out.println(average(x,2)); //5.5 
     System.out.println(average(x,7)); //4.4 

     //number 2 
     li.add("Hi"); 
     li.add("del"); 
     li.add("there"); 
     li.add("del"); 
     li.add("you"); 
     li.add("del"); 
     System.out.println(li); 
     takeOut(li,"del"); 
     System.out.println(li); 

     //number 3 
     s.add("dog"); 
     s.add("anteater"); 
     s.add("kewl"); 
     s.add("kitty"); 
     s.add("a"); 
     System.out.println(s); 

     //number 4 
     // p[0]=new Person("Kremer","Jim"); 
     //p[1]=new Person("Shi","Kevin"); 
     // p[2]=new Person("Shi","Rebecca"); //I know I spelled your name wrong, Rebecca. (I needed two last names to be the same) 
     // p[3]=new Person("Herman", "Jimmy"); 
     // Arrays.sort(p); //static method in java.util.Arrays 
     // for(int i=0; i<p.length; i++) 
     System.out.println(p[i].getFirstName()+" "+p[i].getLastName()); 

     //number 5 
     f[0]=new Fraction(4,5); 
     f[1]=new Fraction(5,4); 
     f[2]=new Fraction(-8,3); 
     f[3]=new Fraction(6,5); 
     f[4]=new Fraction(-1,2); 
     Arrays.sort(f); 
     for(int i=0; i<f.length; i++) 
      System.out.println(f[i].getNum()+"/"+f[i].getDenom()); 
    } 

    //number 1 
    public static Double average(ArrayList samples, int num) 
    { 
     double sum=0.0; 
     if(num>samples.size()) 
     { 
      for(int i=0; i<samples.size(); i++) 
      { 
       if(samples.get(i) instanceof Integer) 
        sum+=(Integer)samples.get(i); 
       else 
        sum+=(Double)samples.get(i); 
      } 
      return sum/samples.size(); 
     } 
     else 
     { 
      for(int i=0; i<num; i++) 
      { 
       if(samples.get(i) instanceof Integer) 
        sum+=(Integer)samples.get(i); 
       else 
        sum+=(Double)samples.get(i); 
      } 
      return sum/num; 
     } 

    } 

    //number 2 
    public static void takeOut(List<String> words, String del) 
    { 
     for(int i=0; i<words.size(); i++) 
     { 
      if(words.get(i).equals(del)) 
      { 
       words.remove(i); 
       i--; 
      } 
     } 
    } 

} 

而這裏的排序列表:

import java.util.ArrayList; 
import java.util.List; 
import java.lang.String; 

public class SortedList extends ArrayList<String> 
{ 
    private ArrayList<String> a; 

    public SortedList() 
    { 
     a = new ArrayList<String>(10); 
    } 
    public SortedList(int cap) 
    { 
     super(cap); 
    } 
    public boolean add(String x) 
    { 
     if(a.size()!=0) 
     { 
      for(int i=0; i<a.size(); i++) 
      { 
       if(i==a.size()-1) 
        if(x.compareTo(a.get(i))>=0) 
         super.add(x); 
       else 
       { 
        if(i==0) 
         if(x.compareTo(a.get(i))<=0) 
          super.add(0,x); 
        if(x.compareTo(a.get(i))>=0 && x.compareTo(a.get(i+1))<=0) 
         super.add(i+1,x); 
       } 
      } 
     } 
     else 
      super.add(x); 
     return true; 
    } 
} 

提前感謝!

回答

2

a.size() != 0始終爲false,因爲您的SortedList實施不會在列表a中添加任何元素。這個結果super.add(x)總是使用和重寫的附加方法實際上並沒有修改ArrayList

+0

噢,好的。所以如果我將它改爲a.add(x),它會起作用嗎?我仍然對我應該做什麼感到困惑。 – nauticalnits 2011-04-04 06:41:04

+0

您應該使用'super.size()',因爲您正在擴展'ArrayList'。在當前的實現中你有一個單獨的列表並沒有什麼意義。另一個選擇是實現'List'接口並保留一個'ArrayList'作爲後臺實現,即使用排序添加方法修飾'ArrayList'。 – 2011-04-04 07:39:32

+0

注意:對於較大的列表,您可能需要執行二進制搜索以查找正確的索引。這會讓你插入O(log n)而不是O(n)的性能。 – 2011-04-04 11:43:40

0

用戶的行爲,

查找的Java Collections接口。如果默認排序方式是錯誤的方向

ArrayList<String> a = new ArrayList<String> 

a.add("world"); 
a.add("hello"); 

Collections.sort(a); 

//sorted alphabetically now 

,只是實現自己的Comparator,並呼籲:Java可以這些元素的字母順序爲您挑選

Collections.sort(a, myComparator); 

這應該做你正在尋找的東西,除非當然這是一項家庭作業...

+1

如果經常添加和刪除元素,將元素插入到適當的位置是合理的,而不是在每次插入後對整個集合進行排序。另一方面,如果需要排序的集合,那麼基於樹的數據結構比列表更有意義,因爲可以實現O(log n)插入而不是O(n)。 – 2011-04-04 07:46:59

+0

好點Aleksi。 – 2011-04-04 15:22:10