Java排序动态定义的对象数组列表

Java排序动态定义的对象数组列表,java,list,sorting,arraylist,collections,Java,List,Sorting,Arraylist,Collections,我想整理一下 LG Electronics 1.jpg Apple 2.JPG Apple 3.JPG 作为 这是我的密码 //行是二维的 ArrayList<String[]> rows = new ArrayList<>(); for(int i=0;i<images.length;i++){ com.drew.metadata.Metadata metadata = ImageMetadataReader.readMetadat

我想整理一下

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

这是我的密码 //行是二维的

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

但它也不适合我。我遇到了这样一个错误,没有找到合适的排序方法(arraylist),我建议不要在您的案例中使用类似于
arraylist 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 rows=new ArrayList();
,您只需更改此部分即可在循环中填充它:

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

rows.add(new Metadata(tag.getDescription(), images[i].toString());
最后,您可以使用适当的
比较器进行排序

Collections.sort(rows, Comparator
                        .comparing(Metadata::getDescription)
                        .thenComparing(Metadata::getImageName));

我建议不要在您的案例中使用诸如
arraylistrows
之类的模型,因为它实际上并不能说明列表中包含的内容,而且会使实现比较变得笨拙

相反,您可以将元数据建模为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 rows=new ArrayList();
,您只需更改此部分即可在循环中填充它:

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

rows.add(new Metadata(tag.getDescription(), images[i].toString());
最后,您可以使用适当的
比较器进行排序

Collections.sort(rows, Comparator
                        .comparing(Metadata::getDescription)
                        .thenComparing(Metadata::getImageName));

行是一个列表,所以它的元素是String[].所以,要比较它们,你需要一个比较器。你能帮我做到这一点吗?我真的被困在实现所有东西上了。似乎没有任何东西对我有效..检查这个链接它提到了Josh Bloch的《有效Java》一书中的一个项目…他明确提到永远不要将泛型与数组混合。这是第一件事…一般来说Josh建议尽量保持精简gs在编程中很简单,然后解决方案也会很简单……行是一个列表,所以它的元素是String[].所以,要比较它们,你需要一个比较器。你能帮我做到这一点吗?我真的被困在实现所有东西上了。似乎没有任何东西对我有效..检查这个链接它提到了Josh Bloch的《有效Java》一书中的一个项目…他明确提到永远不要将泛型与数组混合。这是第一件事…一般来说Josh建议尽量保持精简编程简单,然后解决方案也会简单…很乐意提供帮助。如果你认为这回答了你的问题,你也可以选择接受答案。现在,如果我想在排序后获得原始值,比如:Apple 2.JPG Apple 3.JPG LG Electronics 1.JPG Now当我在排序后打印
我得到的只是像排序这样的输出。Data@387f0054`如何获取特定值,如
imageName
我修改了
Metadata
类,以包含一个
toString()
实现,该实现应该能够解决问题(并且可以根据需要进行更改)。我想你可以在UI中的某个地方勾选一个复选框来接受答案。完成兄弟,这真的很有帮助…我被困在这里,但我想感谢你乐于帮助。如果你认为这回答了你的问题,你也可以选择接受答案。现在,如果我想在排序后获得原始值,比如:Apple 2.JPG,该怎么办苹果3.JPG LG Electronics 1.JPG现在当我在排序后打印
时,我得到的是类似“排序”的输出。Data@387f0054`我怎样才能获得像
imageName
这样的特定值?我修改了
Metadata
类,以包含一个
toString()
实现,该实现应该解决这个问题(你可以随意更改)。我想你可以在UI中的某个地方勾选一个复选框来接受答案。完成了,兄弟,这真的很有帮助…我被困在这里,但我想感谢你