【问题标题】:Compare method only called when 3 or more objects exist仅当存在 3 个或更多对象时才调用比较方法
【发布时间】:2013-11-30 14:47:26
【问题描述】:

我试图了解当且仅当创建了 3 个或更多 Jpeg 对象时才调用 compare 方法。

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

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

【问题讨论】:

    标签: java date compare compareto


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      移出你的 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);
      

      【讨论】:

        【解决方案3】:

        尝试首先将元素添加到您的集合中,然后排序:

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

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

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

        【讨论】:

        • 非常感谢先生。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-07
        相关资源
        最近更新 更多