Java在ArrayList上实现比较器

标签 java overriding comparator compareto

我对 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 

     }
 }
}

最佳答案

您已经实现了 Comparable 您的MediaInterface中的界面类,这是一个通用接口(interface),因此您可以实现 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));
}

关于Java在ArrayList上实现比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3694378/

相关文章:

java - 屏幕不刷新 swing java

java - 扩展类不能继承方法吗?

java - Comparator.comparing().reversed() 反转所有早期的比较器?

java - 从资源文件夹中找不到文件

java - 改造 - Json 响应可以根据类型包含不同的字段

c# - 重写方法文档

java - 如何重写 Java 中 ArrayList 的 toString 方法?

Java 文件列表未使用比较器排序

Java按第三列的数值对二维字符串数组进行排序

java - usb4java:无法进行数据传输