2016-02-28 4 views
0

Я создал пользовательский объект под названием FileTypeпользовательский объект в ArrayList поискового

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; 
    } 
} 

EDIT: Я также создал класс 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", "Bootstrap HTML Files", "картинки/html.png"

Теперь я потерян, потому что я хочу сказать, что-то вроде:

list.findelementbytype ("HTML") ; который будет возвращать объект FileType, который я мог бы получить и получить остальные значения/атрибуты.

Am i на правильном пути или я делаю это неправильно? Это для File Chooser, который я пишу, и я хотел иметь все соответствующие данные в одном объекте. Больше ОО, спасибо!


РЕШЕНИЕ

Тип файла класса, который создает каждый элемент данных.

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"); 

Эти классы были созданы, чтобы увеличить JFileChooser в более OO способом при добавлении пользовательских фильтров, просмотреть условия и значки.

Я уверен, что это не является оптимальным, когда речь идет о производительности и хэш-карта будет более идеальным выбором, но для моих целей и временных ограничений, это делает работу я хочу :)

+0

Если они будут только для поиска по расширению файла, тогда вы можете поместить все ваши объекты FileType в HashMap, где ключ - это «html», «xml» и т. д. Это упростит поиск. Если, однако, вы ожидаете, что сможете выполнить поиск по идентификатору или расширению или другому полю, вам придется использовать другой способ, возможно, другой класс, чтобы инкапсулировать поведение, доступное для поиска. – pczeus

+0

Я также создаю класс FileList, но я получаю исключение нулевого указателя в методе добавления :( – codeCompiler77

+0

Вы никогда не инициализируете fileList. Измените строку вверху: 'ArrayList fileList = new ArrayList <>();' – pczeus

ответ

1

Вы можете использовать HashMap где вы сопоставляете требуемое свойство с объектом. Если вы хотите, чтобы ваши объекты использовали более одного свойства, вы можете создать несколько HashMap. Проблема такого подхода заключается в том, что вы получаете одну карту для каждого свойства, которое вы хотите ухаживать, и вы можете получить только объект за ключ.

Если вы ищете сортировку, мое предложение состоит в использовании TreeMap и скрипке с интерфейсом Comparator, который позволяет реализовать компараторы для нескольких свойств.

Edit: Поскольку может быть слишком много свойств, чтобы искать после того, как и цель не сортировка, возможно, лучший способ сохранить с помощью 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. Это в основном облегчает весь этот процесс.

+0

Я не очень опытен с кем-либо из них, есть ли способ сделать это с ArrayList или у вас есть пример, который вы можете предложить? Я также создаю класс FileList, но я получаю исключение нулевого указателя в методе добавления :( – codeCompiler77

+0

@ codeCompiler77 Я обновил свой ответ с лучшим решением, используя только 'ArrayList'. – Bifz

+0

Это то, что я сделал сам, я отправил свой решение в моем первоначальном вопросе.Если у вас есть какие-либо советы о моем решении выше, дайте мне знать. Спасибо за помощь! – codeCompiler77

0

Если вы просто хотите, чтобы получить список всех типов файлов в списке файлов, которые соответствуют данному типу, то это следует сделать трюк:

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; 
} 

поправьте меня, если я неправильно понял вас

+0

Нет, вы в порядке, я сделал гибрид вашего решения и Bifz ниже. Спасибо за помощь Я разместил свой рабочий код в вопросе выше. Если у вас есть какие-либо советы, дайте мне знать :) – codeCompiler77

Смежные вопросы