Java сортировка динамически определенного массива объектов - PullRequest
0 голосов
/ 15 ноября 2018

Я хочу отсортировать это

LG Electronics  1.jpg   
Apple   2.JPG   
Apple   3.JPG

Как

Apple   2.JPG   
Apple   3.JPG
LG Electronics  1.jpg   

Вот мой код // строки 2d

ArrayList<String[]> rows = new ArrayList<>();
for(int i=0;i<images.length;i++){
    com.drew.metadata.Metadata metadata = ImageMetadataReader.readMetadata(images[i]);
    for (com.drew.metadata.Directory directory : metadata.getDirectories()) {
        for (Tag tag : directory.getTags()) {
            //System.out.println(tag.toString());
            if(tag.toString().contains("[Exif IFD0] Make")){
                rows.add(new String[]{tag.getDescription(),images[i].toString()});
            }
        }
    }
}

Я реализовал Collections.sort(rows);, но у меня ничего не работает. Я даже попробовал

Collections.sort(rows, new Comparator<ArrayList<String>>() {
    @Override
    public int compare(ArrayList<String> o1, ArrayList<String> o2) {
    return o1.get(0).compareTo(o2.get(0));
    }
    });

Но это также не работает для меня. Я получил эту ошибку, что не найдено подходящего метода для сортировки (arraylist

1 Ответ

0 голосов
/ 15 ноября 2018

Я бы посоветовал не использовать такую ​​модель, как ArrayList<String[]> rows, в вашем случае, потому что она на самом деле мало что говорит о том, что содержит список - и это делает реализацию сравнения неуклюжей.

Вместо этого,вы можете смоделировать метаданные как класс Java:

public class Metadata {

  private final String description;
  private final String imageName;

  public Metadata(String description, String imageName) {
    this.description = description;
    this.imageName = imageName;
  }
  public String getDescription() {return description;}
  public String getImageName() {return imageName;}

  @Override
  public String toString() {
    return description + " " + imageName;
  }
}

Теперь у вас может быть List<Metadata> rows = new ArrayList<>();, который вы заполняете внутри цикла, изменяя только эту часть:

rows.add(new String[]{tag.getDescription(),images[i].toString()});

в эту

rows.add(new Metadata(tag.getDescription(), images[i].toString());

И, наконец, вы можете отсортировать по правильному Comparator, используя

Collections.sort(rows, Comparator
                        .comparing(Metadata::getDescription)
                        .thenComparing(Metadata::getImageName));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...