gpt4 book ai didi

java - ArrayList 中的自定义对象和可搜索对象

转载 作者:行者123 更新时间:2023-12-01 10:19:44 24 4
gpt4 key购买 nike

我创建了一个名为 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;
}
}

维护数据的自定义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");

创建这些类是为了在添加自定义过滤器、 View 条件和图标时将 JFilechooser 增强为更加面向对象的方式。

我确信这在性能方面并不是最佳的, HashMap 将是一个更理想的选择,但出于我的目的和时间限制,这完成了我想要的工作:)

最佳答案

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

如果您正在寻找排序,我的建议是使用 TreeMap 并使用 Comparator 接口(interface),该接口(interface)允许为多个属性实现比较器。

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

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。这些基本上简化了整个过程。

关于java - ArrayList 中的自定义对象和可搜索对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35677855/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com