ArrayList 和 Searchable 中的自定义对象
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 class
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");这将 return FileType 对象,然后我可以访问并获取剩余的 values/attributes.
我是在正确的轨道上还是做错了?这是我正在编写的文件选择器,我想将所有相关数据放在一个对象中。更多OO,谢谢!
解决方案
创建每个数据条目的文件类型Class。
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");
创建这些 classes 是为了在添加自定义过滤器、视图条件和图标时将 JFilechooser 增强为更面向对象的方式。
我确信这在性能方面不是最佳选择,哈希映射将是更理想的选择,但出于我的目的和时间限制,这可以完成我想要的工作:)
您可以使用 HashMap
将所需的 属性 映射到对象。如果您想使用多个 属性 来获取您的对象,您可以创建多个 HashMap
。这种方法的问题是你最终会为每个你想要照顾的 属性 得到一张地图,并且你只能为每个键获取对象。
如果您正在寻找排序,我的建议是使用 TreeMap
和 fiddle 以及 Comparator
接口,这样可以为多个属性实现比较器。
编辑:
由于可能有太多的属性需要照顾,而且目标不是排序,也许最好的方法是继续使用 ArrayList
并添加 Checker
classes,它检查是否File
具有指定的 属性 值。
它的工作方式类似于 Comparator
接口(这里的泛型是可选的):
public interface Checker<T>
{
public boolean hasProperty(T o);
}
一个 Checker
class 的例子,通过它的名字找到一个 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
修改为 return 多个 File
。
如果您选择遵循此解决方案,我建议您查看 Java 8 个 lambdas 和 Stream
方法,即 filter
。这些基本上简化了所有这个过程。
如果您只想获取 fileList 中与给定类型匹配的所有文件类型的列表,那么这应该可以解决问题:
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;
}
如果我误解了你,请纠正我
我创建了一个名为 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 class
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");这将 return FileType 对象,然后我可以访问并获取剩余的 values/attributes.
我是在正确的轨道上还是做错了?这是我正在编写的文件选择器,我想将所有相关数据放在一个对象中。更多OO,谢谢!
解决方案
创建每个数据条目的文件类型Class。
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");
创建这些 classes 是为了在添加自定义过滤器、视图条件和图标时将 JFilechooser 增强为更面向对象的方式。
我确信这在性能方面不是最佳选择,哈希映射将是更理想的选择,但出于我的目的和时间限制,这可以完成我想要的工作:)
您可以使用 HashMap
将所需的 属性 映射到对象。如果您想使用多个 属性 来获取您的对象,您可以创建多个 HashMap
。这种方法的问题是你最终会为每个你想要照顾的 属性 得到一张地图,并且你只能为每个键获取对象。
如果您正在寻找排序,我的建议是使用 TreeMap
和 fiddle 以及 Comparator
接口,这样可以为多个属性实现比较器。
编辑:
由于可能有太多的属性需要照顾,而且目标不是排序,也许最好的方法是继续使用 ArrayList
并添加 Checker
classes,它检查是否File
具有指定的 属性 值。
它的工作方式类似于 Comparator
接口(这里的泛型是可选的):
public interface Checker<T>
{
public boolean hasProperty(T o);
}
一个 Checker
class 的例子,通过它的名字找到一个 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
修改为 return 多个 File
。
如果您选择遵循此解决方案,我建议您查看 Java 8 个 lambdas 和 Stream
方法,即 filter
。这些基本上简化了所有这个过程。
如果您只想获取 fileList 中与给定类型匹配的所有文件类型的列表,那么这应该可以解决问题:
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;
}
如果我误解了你,请纠正我