【问题标题】:Sorting an array list with a delimiter使用分隔符对数组列表进行排序
【发布时间】:2014-04-04 01:52:07
【问题描述】:

我已经被这个问题困扰了很长时间,我不知道该怎么办。 基本上我有一个包含人名的文本文件,然后是学生编号,然后是这样的奖金:

Green%3243%1000
Kevin%7657%400
Frank%345%10000
Bob%5435%5000
Stefan%31231%1000
Javis%4532%100
IronMan%5435%2000
Lamp%534%3000

我想做的是根据最后一个数字对数组进行排序。

我试过这个可憎的东西(不要费心去读它的垃圾):

    boolean flag = true;
    String temp;
    int temp1;
    int temp2;

    while (flag){
        flag = false;
        for(int j=0;  j < list.size() -1;  j++ ){
            System.out.println(list.get(j));
            Scanner s = new Scanner(list.get(j)).useDelimiter("%");
            s.next();
            s.next();
            temp1 = s.nextInt();
            Scanner s2 = new Scanner(list.get(j+1)).useDelimiter("%");
            s2.next();
            s2.next();
            temp2 = s2.nextInt();
            if (temp1 < temp2){
                temp = list.get(j);
                list.add(j, list.get(j+1));
                list.add(j+1,temp);
                flag = true;
            } 
        } 
    }

但它只是无限循环。我虽然只是将数组列表修补成冒泡排序。

如果有人有任何想法并愿意分享,将不胜感激。

【问题讨论】:

    标签: java arrays sorting arraylist delimiter


    【解决方案1】:

    Java 是一种面向对象的语言,所以我只使用对象:

    • 使用您要存储的三个值创建一个Student 对象(以及一个toString() 方法来打印它们,用“%”分隔:

      public class Student {
          private final String name;
          private final int number;
          private final int prizeMoney;
      
          public Student(final String name, final int number, final int prizeMoney) {
              this.name = name;
              this.number = number;
              this.prizeMoney = prizeMoney;
          }
      
          @Override
          public String toString() {
              return name+"%"+number+"%"+prizeMoney;
          }
      
          public int getPrizeMoney() {
              return prizeMoney;
          }
      }
      
    • 将您的行读取为Student 对象,并将它们存储在List 中:

      final Scanner scan = new Scanner(new File("/path/to/StudentsList"));
      final List<Student> students = new ArrayList<Student>();    
      
      while (scan.hasNextLine()) {
          final Scanner line = new Scanner(scan.nextLine());
          line.useDelimiter("%");
      
          students.add(new Student(line.next(), line.nextInt(), line.nextInt()));
      
          line.close();
      }
      scan.close();
      
    • 使用自定义Comparator 订购List,然后打印:

      students.sort(new Comparator<Student>() {
          @Override
          public int compare(final Student s1, final Student s2) {
              return s1.getPrizeMoney()-s2.getPrizeMoney();
          }
      });
      
      for (final Student student: students)
          System.out.println(student);
      

    输出

    Javis%4532%100
    Kevin%7657%400
    Green%3243%1000
    Stefan%31231%1000
    IronMan%5435%2000
    Lamp%534%3000
    Bob%5435%5000
    Frank%345%10000
    

    【讨论】:

    • 这似乎是正确的答案,但是我还没有达到能够使用该代码的技能水平。我试过了,到处都是错误,主要是因为我不知道如何处理它。无论如何,谢谢。
    • @Kevin 你有什么错误?您必须将Student 类放在它自己的文件(称为Student.java)中,并对创建新Scanner 时可能抛出的FileNotFoundException 做一些事情,否则它应该只通过复制来工作-粘贴它。
    • 我不知道它有什么问题,我做了你所说的一切,不要对你投入的所有工作忘恩负义(看起来很多)但是其他人建议使用三维数组这样做,这就是我要尝试的。再次感谢您的帮助。
    • @Kevin 如果你还有兴趣,我把两个完整的文件放到网上pastebin.com/BrR0c9q0pastebin.com/6x9Kiqaw;您可能想要更改的是包名称和学生列表文件的路径。
    【解决方案2】:

    这里有一些东西可以让你开始。

    1. 为奖金创建地图 => 行作为键/值对
    2. 读取文件中的每一行,解析它并将键/值对放入上面的映射中
    3. 地图准备就绪后,将键条目集转换为列表等集合
    4. 使用 Collections.sort() 对集合进行排序
    5. 遍历创建的地图,并为集合中的每个值从地图中获取相应的值。

    希望这可以帮助您了解工作流程。

    【讨论】:

      【解决方案3】:

      我考虑在这里创建一个 8x8x8 的 3d 数组,数组中从右到左是行,列,因此 [0][0][1] 是块一或 kevin [0][1][1] 是7657 [1][1][1] 是 400。我喜欢这种方式,因为它不仅为每个“项目”提供了一个数组,还可以让您保持井井有条且易于访问

      【讨论】:

      • 这似乎是一个非常好的方法,但我不知道该怎么做,我已经尝试了一段时间,但我一直没有运气。愿意帮忙吗?
      • 是的,没问题,虽然我有一段时间没用过扫描仪类了。我知道它是 System.in() 的扩展类,它实际上是 javas 本机输入类,这就是为什么 Scanner scan = new Scanner(System.in()) 我将很快添加另一个答案。但是有几件事,请逐步解释您认为应该如何完成。您想成为一名软件工程师吗?
      • 我梦想现在就完成这项任务,但我不知道如何为此设置循环。因为我正在输入这个,我想到了一些东西,如果它有效,我会回复。
      • 我认为应该怎么做就是你在最初的回答中所说的那样,所以我需要一个循环遍历每个索引,将每个索引分配给列表的一部分,我可以使用 split("% ") 而不是分隔符,但我不明白如何设置循环来完成此操作。我在想 3 个嵌套的 for 循环,但这不起作用。
      • 是的,不,我也是,我脑海中闪过一种类型是字符串,另外两种是整数,除了字符串数组中的字符串或整数数组中的整数之外,我们不能存储任何其他类型. While(nextLine())//假设是一个布尔值,报告是否还有更多标记。在该主体中,只需创建 3 个数组,但保持它们对齐,以便读取名称存储、递增行、读取中间 int 存储、迭代列、读取下一个值、存储,然后递增 z 值。这是一种被黑的方式,使用对象更容易解决。方法 BubbleSort(Int[] a)/nested loop grab number 1 enter nest mv
      猜你喜欢
      • 1970-01-01
      • 2021-03-30
      • 1970-01-01
      • 2016-04-05
      • 2020-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-05
      相关资源
      最近更新 更多