【问题标题】:Sorting string array by employee id number按员工编号对字符串数组进行排序
【发布时间】:2021-05-06 15:07:23
【问题描述】:

这是我的代码:

BufferedReader reader = new BufferedReader(new FileReader("Database.txt"));
ArrayList<String> str = new ArrayList<>();
String line = "";
while((line = reader.readLine()) != null){
    str.add(line);
}
reader.close();
Collections.sort(str);
FileWriter writer = new FileWriter("final.txt");
for(String s: str){
    writer.write(s);
    writer.write("\r\n");
}
writer.close();
FileWriter writers = new FileWriter("finals.txt");
for(String s: str){
    writers.write(s);
    writers.write("\r\n");
}
writers.close();   

输入:

DADDY,1,GOOD,BAD
BABY,3,GOOD, BAD

使用我的代码输出:

BABY,3,GOOD,BAD
DADDY,1,GOOD,BAD

数组按names 排序,而不是number。 我想使用数字、1 和 3 对其进行排序。

预期输出:

DADDY,1,GOOD,BAD
BABY,3,GOOD, BAD

可以用数字排序吗?

【问题讨论】:

    标签: java arrays string sorting arraylist


    【解决方案1】:

    您可以将split 每个字符串用逗号分隔成一个数组,然后使用sorted 方法按第二列对这些数组进行排序:

    List<String> list = List.of(
            "DADDY,1,GOOD,BAD",
            "BABY,3,GOOD, BAD");
    
    List<String> sorted = list.stream()
            // split into an array by commas,
            // and remove redundant spaces
            // Stream<String[]>
            .map(str -> str.split(",\\s*"))
            // sort by number
            .sorted(Comparator.comparing(arr -> arr[1]))
            // join back into one string
            // Stream<String>
            .map(arr -> String.join(",", arr))
            // collect strings into a list
            .collect(Collectors.toList());
    
    // output
    sorted.forEach(System.out::println);
    
    DADDY,1,GOOD,BAD
    BABY,3,GOOD,BAD
    

    【讨论】:

      【解决方案2】:
      1. 因为它是一个字符串的ArrayList,所以默认比较在这里不起作用。
      2. 所以你必须拆分字符串并将其转换为其他对象,我们可以在其中单独比较数值。因此,创建一个 Data 对象。在其中,通过重写默认的 compareTo 方法来编写您自己的比较逻辑。
      class Data implements Comparable{
          int val;// 1
          String name;// Daddy
          String status;// Good
          String mode; //bad
          Data(int val, String name, String status, String mode){
              this.val = val;
              this.name = name;
              this.status = status;
              this.mode = mode;
          }
          
          @Override
          public String toString() {
              return name+","+ val + ","+ status+","+ mode;
          }
          //Custom logic for sorting
          @Override
          public int compareTo(Object data) {
               int compareVal=((Data)data).val;
                  
              return this.val-compareVal;
      
              /* For Descending order do like this */
              //return compareVal-this.val;
          }
      }
      
      1. 您的主要代码块将是,
          //ignore method name
          public void CustomDdWriter {
              //FileWriter writer;
              FileWriter writers = null;
              try {
                  BufferedReader reader = new BufferedReader(new FileReader("Database.txt"));
                  ArrayList<Data> dataList = new ArrayList<>();
                  String line = "";
                  while((line = reader.readLine()) != null){
                      //split string and construct Data object and add it to dataList 
                      dataList.add(parse(line));
                  }
                  reader.close();
                  Collections.sort(dataList);
                  
                  writers = new FileWriter("finals.txt");
                  for(Data d: dataList){
                      writers.write(d.toString());
                      writers.write("\r\n");
                  }
                  
                  writers.close();
              }catch(Exception ex) {
                  
                  ex.printStackTrace();
              }finally {
                  
              }
      
          }
      
          private Data parse(String line) {
              String[] sArray = line.split(",");
              return new Data(Integer.valueOf(sArray[1]), sArray[0],sArray[2], sArray[3]);
              
          }
      

      解决方案说明:

      • 需要逐行从文件中读取数据。
        • BufferedReader 处理这个。
      • 需要根据内部数字值对这些行(字符串)进行排序。
        • 我们无法根据内部数值对字符串数组进行排序。所以,我们需要创建一个自定义对象,这里是 Data Class。
        • 我们通过调用 parse 方法来分割一行。 Parse 方法根据 , 解析一个字符串。解析后,我们使用自定义构造函数构造 Data 对象并返回它。
        • 然后我们将这个 Data 对象存储到一个 ArrayList(dataList) 中。
        • 最后我们可以调用Collection.sort(dataList)。但它是否以正确的顺序对数据进行排序?内部数据类有 4 个成员,用于排序将选择哪个成员?
          • 在 Data 类中,我们有 @override compareTo 方法。我们声明,我们要根据 val 成员对数据进行排序。所以,Collection.sort(dataList) 对数据进行排序 所需的数值。
      • 需要重新写入 .txt 文件。
        • 为了轻松做到这一点,在 Data 类中,我们使用 @override toString 方法。所以在文件写入过程中,它会毫不费力地创建我们想要的字符串。

      有关详细的代码库和解释,请关注github repo。

      【讨论】:

        【解决方案3】:

        您可以使用提取 ID 号的自定义比较器对其进行排序,假设它位于第一个和第二个逗号之间:

        Comparator<String> comparator = Comparator.comparingInt(s -> {
          int firstComma = s.indexOf(',');
          int secondComma = s.indexOf(',', firstComma + 1);
          return Integer.parseInt(s.substring(firstComma + 1, secondComma));
        });
        str.sort(comparator);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-10-14
          • 1970-01-01
          • 1970-01-01
          • 2014-07-10
          • 2019-11-24
          • 1970-01-01
          • 2016-04-23
          相关资源
          最近更新 更多