ArrayList和Searchable中的自定义对象

时间:2016-02-28 02:02:58

标签: java object arraylist jfilechooser

我创建了一个名为FileType

的自定义对象
import javax.swing.ImageIcon;

class FileType
{
    private int     index;
    private String  type;
    private String  extension;
    private String  description;
    ImageIcon       icon;

    public FileType(int index, String type, String extension, String description, String icon)
    {
        this.index = index;
        this.type = type;
        this.extension = extension;
        this.description = description;
        this.icon = Utils.createImageIcon(icon);
    }

    public int getIndex()
    {
        return index;
    }

    public String getType()
    {
        return type;
    }

    public String getExtension()
    {
        return extension;
    }

    public String getDescription()
    {
        return description;
    }

    public ImageIcon getIcon()
    {
        return icon;
    }
}

编辑:我还创建了一个FileList类

import java.util.AbstractList;
import java.util.ArrayList;

public class FileList extends AbstractList
{

    private ArrayList<FileType> fileList;

    public FileList()
    {
    }

    public void add(int index, String type, String extension, String description, String icon)
    {
        FileType data = new FileType(index, type, extension, description, icon);
        if (!fileList.contains(data))
        {
            fileList.add(data);
        }
    }

    @Override
    public Object get(int index)
    {
        return fileList.toArray()[index];
    }

    @Override
    public int size()
    {
        return fileList.size();
    }
}

现在我想创建诸如

之类的对象
  • “1”,“html”,“ASCII HTML Files”,“images / html.png”
  • “2”,“html”,“Bootstrap HTML Files”,“images / html.png”

现在我迷失了,因为我想说出类似的话:

list.findelementbytype(“html”);这将返回FileType对象,然后我可以访问并获取剩余的值/属性。

我是在正确的轨道上还是我做错了?这是我正在编写的文件选择器,我希望将所有相关数据放在一个对象中。更多OO,谢谢!

创建每个数据条目的文件类型类。

import javax.swing.ImageIcon;

class FileType
{
    private int     index;
    private String  search;
    private String  type;
    private String  extension;
    private String  description;
    ImageIcon       icon;

    public FileType(int index, String search, String type, String extension, String description, String icon)
    {
        this.index = index;
        this.search = search;
        this.type = type;
        this.extension = extension;
        this.description = description;
        this.icon = Utils.createImageIcon(icon);
    }

    public int getIndex()
    {
        return index;
    }

    public String getSearch()
    {
        return search;
    }

    public String getType()
    {
        return type;
    }

    public String getExtension()
    {
        return extension;
    }

    public String getDescription()
    {
        return description;
    }

    public ImageIcon getIcon()
    {
        return icon;
    }
}

维护数据的Custom ArrayList对象。

import java.util.AbstractList;
import java.util.ArrayList;

import javax.swing.ImageIcon;

public class FileList extends AbstractList
{
    private ArrayList<FileType> fileList;

    public FileList()
    {
        fileList = new ArrayList<FileType>();
    }

    public void add(String search, String type, String extension, String description, String icon)
    {

        FileType data = new FileType(fileList.size(), search, type, extension, description, icon);
        if (!fileList.contains(data))
        {
        fileList.add(data);
        }
    }

    @Override
    public Object get(int index)
    {
        return fileList.toArray()[index];
    }

    public int getIndex(String search)
    {
        for (FileType obj : fileList)
        {
            if ((obj.getSearch()).equalsIgnoreCase(search))
                return obj.getIndex();
        }
        return -1;
    }

    public String getType(String search)
    {
        for (FileType obj : fileList)
        {
            if ((obj.getSearch()).equalsIgnoreCase(search))
                return obj.getType();
        }
        return "";
    }

    public String getExtension(int index)
    {
        for (FileType obj : fileList)
        {
            if (obj.getIndex() == index)
                return obj.getExtension();
        }
        return "";
    }

    public String getExtension(String search)
    {
        for (FileType obj : fileList)
        {
            if ((obj.getSearch()).equalsIgnoreCase(search))
                return obj.getExtension();
        }
        return "";
    }

    public String getDescription(String search)
    {
        for (FileType obj : fileList)
        {
            if ((obj.getSearch()).equalsIgnoreCase(search))
                return obj.getDescription();
        }
        return "";
    }

    public ImageIcon getIcon(String search)
    {
        for (FileType obj : fileList)
        {
            if ((obj.getSearch()).equalsIgnoreCase(search))
                return obj.getIcon();
        }
        return null;
    }

    @Override
    public int size()
    {
        return fileList.size();
    }
}

你可以这样称呼:

    FileList list = new FileList();
    list.add("html", "random desc html", Utils.html, "ASCII HTML Files", "images/html.png");
    list.add("bootstrap.html", "random desc bootstrap", Utils.bootstrap, "Bootstrap HTML Files",
            "images/bootstrap.png");
    list.add("xml", "random desc xml", Utils.xml, "XML Files", "images/xml.png");
    list.add("json", "random desc json", Utils.json, "JSON Files", "images/json.png");
    list.add("pdf", "random desc pdf", Utils.pdf, "PDF Documents", "images/pdf.png");
    list.add("doc", "random desc doc", Utils.doc, "Google Documents", "images/doc.png");

这些类的创建是为了在添加自定义过滤器,查看条件和图标时将JFilechooser扩展为更加OO的方式。

我确信这在性能方面不是最佳选择,而哈希地图将是一个更理想的选择,但出于我的目的和时间限制,这可以完成我想要的工作:)

2 个答案:

答案 0 :(得分:1)

您可以使用HashMap将所需属性映射到对象。如果要使用多个属性获取对象,可以创建多个HashMap。这种方法的问题在于,您最终会为每个要查看的属性创建一个映射,并且每个键只能获得对象。

如果您正在寻找排序,我的建议是使用TreeMap并使用Comparator界面,这允许为多个属性实现比较器。

修改 由于可能有太多属性需要关注并且目标不是排序,因此最好的方法是继续使用ArrayList添加Checker类,以检查是否File具有指定的属性值。 它的工作方式类似于Comparator接口(此处的泛型是可选的):

public interface Checker<T>
{
    public boolean hasProperty(T o);
}

Checker类的一个示例,用于按名称查找File

public class FileNameChecker implements Checker<File>
{
    private String name;

    public FileNameChecker(String name) {
        this.name = name;
    }

    @Override
    public boolean hasProperty(File f) {
        return f.getName().equals(name);
    }

}

在您的文件系统中,通用find方法:

public File find(Checker<File> checker) {
    for(File f : fileList) {
        if(checker.hasProperty(f))
            return f;
    }
    return null;
}

并将其命名为:

find(new FileNameChecker("Filename"))

请注意,您可以轻松修改find以返回多个File

如果您选择遵循此解决方案,我建议您查看Java 8 lambdas和Stream方法,即filter。这些基本上可以简化这一过程。

答案 1 :(得分:0)

如果您只想获取fileList中与给定类型匹配的所有FileType的列表,那么这应该可以解决问题:

public ArrayList<FileType> findElementByType(String type){
  ArrayList<FileType> matchingFiles = new ArrayList<FileType>();
  for (FileType file : fileList){
    if (file.getType.equals(type)){
      matchingFiles.add(file); 
    }
  }
  return matchingFiles;
}

如果我误解了你,请纠正我