2011-04-04 163 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