比较方法仅在存在3个或更多对象时调用

时间:2013-11-30 14:47:27

标签: java date compare compareto

我正在尝试理解,当且仅当已创建3个或更多 Jpeg 对象时才调用 compare 方法。

目标是在将Jpeg时间戳添加到表之前按升序对其进行排序。

2 Objects not following sequence

3 Objects in ascending order

private class ExtractJpegMetadata extends Task {

    private File[] selectedJpegs;
    private Jpeg jpeg;

    public ExtractJpegMetadata(Application application, File[] selectedJpegs) {
        super(application);
        this.selectedJpegs = selectedJpegs;
    }

    @Override
    protected Object doInBackground() throws Exception {
        setMessage("Extracting jpeg metadata.");

        for (File file : selectedJpegs) {
            com.drew.metadata.Metadata metadata = ImageMetadataReader.readMetadata(file);
            // obtain the Exif directory
            ExifSubIFDDirectory directory = metadata.getDirectory(ExifSubIFDDirectory.class);
            jpeg = new Jpeg();
            jpeg.setImgTimestamp(directory.getDate(ExifSubIFDDirectory.TAG_DATETIME_ORIGINAL));

            Collections.sort(jpegList, jpeg);
            jpegList.add(jpeg);

        }

        jpegAlbum.setJpegAlbum(jpegList);         
        return null;
    }

    @Override
    protected void succeeded(Object result) {
        setMessage("Finished extracting jpeg metadata.");
        updateTableNeeded(true);
    }
}

Jpeg课程

@XmlRootElement
public class Jpeg implements Comparator<Jpeg> {

private Date imgTimestamp;

public Jpeg() {
}

public Jpeg(Date imgTimestamp) {
    this.imgTimestamp = imgTimestamp;
}

public Date getImgTimestamp() {
    return imgTimestamp;
}

@XmlElement
public void setImgTimestamp(Date imgTimestamp) {
    this.imgTimestamp = imgTimestamp;
}

public int compare(Jpeg t, Jpeg t1) {
    return t.getImgTimestamp().compareTo(t1.getImgTimestamp());
}
}

3 个答案:

答案 0 :(得分:6)

在第一次迭代中,列表为空,然后对其进行排序。没有什么可比的。然后在列表中添加一个元素。

在第二次迭代中,列表包含单个元素,然后对其进行排序。还有什么可比的。然后在列表中添加一个元素。

在第三次迭代中,列表中有两个元素,您可以对其进行排序。因此将第一个元素与第二个元素进行比较。然后在列表中添加一个元素。

我不明白你想要实现的目标,但在每次迭代时对列表进行排序是没有用的。您最好添加所有元素,完成后,然后对列表进行排序。同样,在每次迭代时重建新的比较器也是无用的。由于这个比较器只在一个方法中使用,并且实际上并不是你任务状态的一部分,所以也没有理由把它作为一个实例变量。

答案 1 :(得分:3)

移出你的Collections.sort(jpegList,jpeg);来自for循环

更改

   for (File file : selectedJpegs) {
        com.drew.metadata.Metadata metadata = ImageMetadataReader.readMetadata(file);
        // obtain the Exif directory
        ExifSubIFDDirectory directory = metadata.getDirectory(ExifSubIFDDirectory.class);
        jpeg = new Jpeg();            jpeg.setImgTimestamp(directory.getDate(ExifSubIFDDirectory.TAG_DATETIME_ORIGINAL));
        Collections.sort(jpegList, jpeg);  
                 |
                 Problem is here (jpegList is sorted here)                          

        jpegList.add(jpeg);      
             |
             adding element to sorted list (the jpeg added at last)
   }

 for (File file : selectedJpegs) {
        com.drew.metadata.Metadata metadata = ImageMetadataReader.readMetadata(file);
        // obtain the Exif directory
        ExifSubIFDDirectory directory = metadata.getDirectory(ExifSubIFDDirectory.class);
        jpeg = new Jpeg();            jpeg.setImgTimestamp(directory.getDate(ExifSubIFDDirectory.TAG_DATETIME_ORIGINAL));
        jpegList.add(jpeg);    
 }
 Collections.sort(jpegList, jpeg);

答案 2 :(得分:2)

首先尝试将元素添加到Collection中,然后排序:

jpegList.add(jpeg);
Collections.sort(jpegList, jpeg);

编辑:另外我注意到你在迭代中进行了排序,我建议先添加所有图像,然后排序:

for (File file : selectedJpegs) {
     jpegList.add(jpeg);
}

Collections.sort(jpegList, jpeg);