2010-09-12 899 views
1

我對Java很陌生,所以這可能是非常簡單的問題。在ArrayList上實現比較器的Java

我想根據指定鍵的自然順序對類MediaLib中的ArrayList排序。

我不知道如何使用Media類中的比較器(compareTo(MediaInterface, key))。這是什麼最好的方式呢?

package assign1; 

import java.util.*; 

public class Media implements MediaInterface { 

    private Map<String, Object> fields; 
    private static int compare; 

public Media(String title, String format) { 
    fields = new TreeMap<String, Object>(); 
    fields.put("title", title); 
    fields.put("format", format); 
} 


public Object get(String key) { 
    return fields.get(key); 
} 


public void put(String key, Object value) { 
    fields.put(key, value); 
} 


public boolean hasKeywords(String[] words, boolean combineWithAND) { 
    Collection<Object> values = (Collection<Object>) fields.values(); 
    int count = 0; 
    int size = 0; 
    for (String s: words) { 
     for (Object o: values) { 
       String t = o.toString(); 
       if (t.indexOf(s) >= 0) { 
        count++; 
        break; 
       } 
     } 
     size++; 
    } 
    if ((count == 0 && !combineWithAND) || (combineWithAND && (count != size))) { 
     return false; 
    } 
    return true; 
} 


public int compareTo(MediaInterface mi, String key) { //<<<<<<<------calling this!! 
    if (mi == null) 
    throw new NullPointerException(); 
    Media m = (Media) mi; 
    Comparable mValue = (Comparable) m.get(key); 
    Comparable lValue = (Comparable) fields.get(key); 
    if ((mValue == null) && (lValue == null)){ 
     return 0; 
    } 
    if ((lValue == null)){ 
      return 1; 
     } 
    if ((mValue == null)){ 
      return -1; 
     } 
    return (lValue).compareTo(mValue); 
} 


@Override 
public int compareTo(MediaInterface mi) { 
    if (mi == null) 
    throw new NullPointerException(); 
    Media m = (Media) mi; 
    Set<String> lSet = fields.keySet(); 
    if (compareTo(m, "title") != 0) { 
     return compareTo(m, "title"); 
    } 
    if (compareTo(m, "year") != 0) { 
      return compareTo(m, "year"); 
     } 
    for (String s: lSet) { 
     if (compareTo(m, s) != 0) { 
      return compareTo(m, s); 
     } 
    } 
    return 0; 
} 


public boolean equals(Object object) { 
    if (object == null) 
    return false; 
    if (!(object instanceof Media)) 
    return false; 
    Media m = (Media) object; 
    if (compareTo(m) != 0) { 
     return false; 
    } 
    return true; 
} 
} 

package assign1; 

import java.util.ArrayList; 
import java.util.Collection; 
import java.util.Collections; 
import java.util.Comparator; 

public class MediaLib implements Searchable { 
private ArrayList<MediaInterface> media; 

public MediaLib() { 
    media = new ArrayList<MediaInterface>(); 
} 


@Override 
public void add(MediaInterface mi) { 
    if (media.isEmpty()) { 
     media.add(mi); 
    } 
    else { 
     for (MediaInterface m: media) { 
      if (mi.equals(m)) { 
       return; 
      } 
     } 
     media.add(mi); 
    } 
} 


@Override 
public boolean contains(MediaInterface mi) { 
    for (MediaInterface m: media) { 
      if (mi.equals(m)) { 
       return true; 
      } 
     } 
    return false; 
} 


@Override 
public Collection<MediaInterface> findByKeyword(String[] words, boolean combineWithAND) { 
    Collection<MediaInterface> foundList = new ArrayList<MediaInterface>(); 
    for (MediaInterface mi: media) { 
     if (mi.hasKeywords(words, combineWithAND)) { 
      foundList.add(mi); 
     } 
    } 
    return foundList; 
} 


@Override 
public Collection<MediaInterface> findByTitle(String str) { 
    Collection<MediaInterface> foundList = new ArrayList<MediaInterface>(); 
     for (MediaInterface mi: media) { 
      if ((mi.get("title")).equals(str)) { 
       foundList.add(mi); 
      } 
     } 
     return foundList; 
} 


@Override 
public Collection<MediaInterface> getAllWithFormat(String formatName) { 
    Collection<MediaInterface> foundList = new ArrayList<MediaInterface>(); 
     for (MediaInterface mi: media) { 
      if ((mi.get("format")).equals(formatName)) { 
       foundList.add(mi); 
      } 
     } 
     return foundList; 
} 

public Collection<MediaInterface> getAll() { 
    Collection<MediaInterface> fullList = new ArrayList<MediaInterface>(); 
     for (MediaInterface mi: media) { 
      fullList.add(mi); 
     } 
     return fullList; 
} 


@Override 
public void removeAllWithKeyword(String[] words, boolean combineWithAND) { 
    Collection<MediaInterface> foundList = findByKeyword(words, combineWithAND); 
    for (MediaInterface mi: foundList) { 
     media.remove(mi); 
    } 
} 


@Override 
public void removeAllWithFormat(String format) { 
    Collection<MediaInterface> foundList = getAllWithFormat(format); 
     for (MediaInterface mi: foundList) { 
      media.remove(mi); 
     } 
} 


@Override 
public void sort() { 
    Collections.sort(media); 
} 


@Override 
public void sort(final String fieldName) { 
    Collections.sort(media, new Media.compareTo(MediaInterface, fieldName)) //<<<<<--------Trying to call compareTo() 

    } 
} 


public void parse(java.io.BufferedReader br) throws java.io.IOException { 
    while(br.readLine()!= null) { 
     Media mi = new Media(/n br.readLine(), br.readLine()); 
     while 

    } 
} 
} 
+1

不MediaInterface實現可比?此外,你的compareTo方法的簽名是錯誤的。下面是它應該看起來的樣子:http://download.oracle.com/javase/tutorial/collections/interfaces/order.html – helpermethod 2010-09-12 09:51:11

+0

它必須這樣做才能使用@ @ Override'註釋的方法來編譯 – 2010-09-12 10:13:54

回答

2

你已經實現你的MediaInterfaceComparable接口,這是一個通用的接口,所以你再實現Comparable<MediaInterface>然後將要求您實現與簽名的方法

public int compareTo(final MediaInterface other) 

這就是爲什麼你的電話Collections.sort(media);編譯

爲了按特定字段名稱排序,您需要提供Comparator的實例,最簡單的方法是在Media類中創建一個內部類,然後您可以將其傳遞到Collections.sort。例如

public class Media implements MediaInterface { 
    public static final class FieldComparator implements Comparator<Media> { 
     private final String field; 

     public FieldComparator(final String field) { 
      this.field = field; 
     } 

     public int compare(final Media a, final Media b) { 
      // implementation to compare a.field to b.field 
     } 
    } 
} 

然後,您可以改寫你的第二個sort方法

@Override 
public void sort(final String fieldName) { 
    Collections.sort(media, new Media.FieldComparator(fieldName)); 
} 
+0

謝謝Jon,我認爲id必須添加一些東西給媒體....很好,謝謝 – Milk 2010-09-13 08:50:02