Java: вернуть LinkedHashSet

По сути, я пытаюсь вернуть набор строк в Java. Но...

  • каждая строка должна быть уникальной, потому что все они являются именами файлов «.db» в текущей папке, поэтому я подумал, что эта коллекция должна быть LinkedHashSet.
  • Элементы (имена файлов) должны поддерживать один и тот же порядок, поэтому я могу выбрать один из них по его порядковому номеру в коллекции.

Моя основная процедура покажет эту коллекцию в компоненте графического интерфейса (возможно, JList), чтобы пользователь мог выбрать один из них (без расширения .db). Я совершенно новичок (как вы можете видеть), поэтому, если вы думаете, что есть лучшие варианты, чем LinkedHashSet, пожалуйста, скажите мне.

Кроме того, как я могу получить эту коллекцию в основном классе?

Что у меня есть до сих пор:

    public Set GetDBFilesList() {

    //returns ORDERED collection of UNIQUE strings with db filenames

    LinkedHashSet a = new LinkedHashSet();

    FilenameFilter dbFilter = (File file, String name) -> {
        return name.toLowerCase().endsWith(".db");
    };

    String dirPath = "";
    File dir = new File(dirPath);
    File[] files = dir.listFiles(dbFilter);

    if (files.length > 0) {
        for (File aFile : files) {
            a.add(aFile.getName());
        }
    }

    return a;
}

person Jack Pott    schedule 09.08.2016    source источник


Ответы (1)


Вам нужна упорядоченная и уникальная коллекция — LinkedHashSet — хороший выбор. Некоторые комментарии к вашему методу:

  • Вы должны использовать дженерики, например: LinkedHashSet<File> или LinkedHashSet<String>
  • Проверка files.length не требуется, но вы можете проверить null, если path не является directory или произошла ошибка ввода-вывода.
  • Вы должны правильно называть свои переменные: a не очень хорошее имя
  • Ваш метод может быть static - может быть, в статическом вспомогательном классе?
  • Метод Set.add returns true или false если элемент был добавлен или нет, вы должны проверить это на всякий случай

Собираем все вместе:

//Your Main class
public class Main
{
   public static void main(String[] args)
   {
       File dir = new File("");
       Collection<File> dbFiles = DbFileManager.getDatabaseFiles(dir);
   }
}

//Your DB File Reader Logic
public class DbFileManager
{
   public static Collection<File> getDatabaseFiles(File directory)
   {
        Collection<File> dbFiles = new LinkedHashSet<>();
        //filter code etc.
        boolean success = dbFiles.addAll(directory.listFiles(filter));
        //Check if everthing was added
        return dbFiles;
   }
}
person HectorLector    schedule 09.08.2016
comment
Спасибо за вашу помощь. Один вопрос: если у меня есть коллекция объектов File, как я могу проанализировать их имена как строки для компонента GUI, такого как JList? - person Jack Pott; 09.08.2016
comment
Вы можете либо просто использовать коллекцию со строками, либо, если вам нужны файловые объекты, просто передать их в конструкторе JList. Это создаст DefaultLitsModel. Элементы будут иметь видимое значение File.ToString(), которое должно быть путем или именем файла. Если вы хотите отображать разные строки, значки, стиль и т. д., вы можете написать свой собственный ListCellRenderer. - person HectorLector; 09.08.2016