簡體   English   中英

ArrayList中的自定義對象和可搜索

[英]Custom Object in ArrayList and Searchable

我創建了一個名為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文件”,“ images / html.png”
  • “ 2”,“ html”,“引導HTML文件”,“ 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的方式。

我確信這在性能方面不是最佳的,哈希映射將是一個更理想的選擇,但出於我的目的和時間限制,這確實可以完成我想要的工作:)

您可以在將所需屬性映射到對象的地方使用HashMap 如果要使用多個屬性獲取對象,則可以創建多個HashMap 這種方法的問題是,對於要維護的每個屬性,最終只能獲得一張地圖,並且每個鍵只能獲取一個對象。

如果您正在尋找排序,我的建議是使用TreeMap並在Comparator接口上TreeMap ,它允許為多個屬性實現比較器。

編輯:由於可能要處理的屬性太多,並且目標不是排序,所以最好的方法可能是繼續使用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 lambda和Stream方法,即filter 這些基本上簡化了所有過程。

如果您只想獲取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;
}

如果我誤會你的話糾正我

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM