【问题标题】:Trouble Sorting an array list对数组列表进行排序时遇到问题
【发布时间】:2019-01-12 21:12:46
【问题描述】:

有没有更好的方法来排序,以获得正确的顺序?谢谢

import java.io.*;
import java.util.*;


public class JpgDirToHtm
{
    public static void main(String[] args) throws FileNotFoundException
    {




        Scanner kb = new Scanner(System.in);  
        System.out.print("Enter the path of the folder whose contents you wish to insert into an html file: ");
        String path = kb.nextLine(); 



        File folder = new File(path);
        File[] listOfFiles = folder.listFiles();
        ArrayList<String> htmlTextList = new ArrayList<String>();

        for (int i = 0; i < listOfFiles.length; i++)
        {
            if (listOfFiles[i].isFile())
            {
                htmlTextList.add(listOfFiles[i].getName() );
            }


        }

        Collections.sort(htmlTextList);

        System.out.println(htmlTextList);
   }
}

这是它打印的内容 [1.jpeg、10.jpg、11.jpeg、12.jpeg、13.jpeg、14.jpeg、16.jpg、17.jpg、18.jpg、19.jpg、2.jpeg、20.jpg、21 .jpg、22.jpg、23.jpg、24.jpg、25.jpg、3.jpg、5.jpg、7.jpeg、9.jpg]

我需要 2.jpeg 在 1.jpeg 等之后出现。

抱歉,可能有一个简单的修复方法,但我在谷歌上没有找到任何东西。我是编程新手。

其他一切都很好。整个程序可以拍摄数千张照片,并以您可以设置的每页给定数量的照片自动将它们放置在正确大小的 html 网页中。如果有人有兴趣拥有其余的代码,我会发布它。

【问题讨论】:

  • 在这种安排中,1Foo.jpg 应该在哪里?
  • 您正在使用字符串比较。您必须剥离文件名将其转换为整数并对其进行排序
  • “例如,1Foo.jpg 在这种排列中应该放在哪里?”好问题。
  • “你正在使用字符串比较。你必须剥离文件名将其转换为整数并对其进行排序”这就是我所害怕的。
  • 有没有办法在 java 中获取元数据,以便我可以按日期排序?

标签: java sorting arraylist


【解决方案1】:

编写你自己的比较器:

    Collections.sort(list, new Comparator<String>() {

        @Override
        public int compare(String o1, String o2) {
            String filename1 =o1.substring(0,o1.indexOf("."));
            String filename2 =o2.substring(0,o2.indexOf("."));
            return Integer.valueOf(filename1).compareTo(Integer.valueOf(filename2));
        }
    });

这会将文件名转换为整数并进行比较。 但请注意,它仅在您的文件名是数字时才有效!

【讨论】:

【解决方案2】:

您必须编写自己的比较器并处理以数字或字符串开头的苍蝇场景:

public class JpgDirToHtm
{

    public static void main(String[] args) throws FileNotFoundException
    {
        Scanner kb = new Scanner(System.in);  
        System.out.print("Enter the path of the folder whose contents you wish to insert into an html file: ");
        String path = kb.nextLine(); 

        File folder = new File(path);
        File[] listOfFiles = folder.listFiles();
        ArrayList<String> htmlTextList = new ArrayList<String>();

        for (int i = 0; i < listOfFiles.length; i++)
        {
            if (listOfFiles[i].isFile())
            {
                htmlTextList.add(listOfFiles[i].getName() );
            }


        }

        Collections.sort(htmlTextList, new Sortbyname());

        System.out.println(htmlTextList);
    }
}

class Sortbyname implements Comparator<String> 
{ 
    // Used for sorting in ascending order of 
    // roll name 
    public int compare(String a, String b) 
    { 
        String tempA = a.split("\\.")[0];
        String tempB = b.split("\\.")[0];

        try
        {
            return Integer.parseInt(tempA)-Integer.parseInt(tempB);
        }
        catch (Exception e)
        {
            return a.compareTo(b); 
        }
    } 
} 

代码通过格式化数字捕获任何异常,然后回退到字符串比较。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多