Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有一种更有效的方法可以用树形图计算字符串的实例?_Java_Treemap - Fatal编程技术网

Java 有没有一种更有效的方法可以用树形图计算字符串的实例?

Java 有没有一种更有效的方法可以用树形图计算字符串的实例?,java,treemap,Java,Treemap,所以我得到了一个树形图,我在其中添加了来自随机生成器的课程,名称是一致的,但顺序不是。例如,我得到了这些: List-course=new-ArrayList(); 课程。添加(“COP2210”); 课程。添加(“COP2250”); 添加(“ENC1250”); 课程。添加(“MLP1337”); 添加(“ENC3250”); 课程。添加(“REL2210”); 添加(“MUS3200”); 添加(“PHI1240”); 添加(“SOL5000”); 添加(“HAL9000”); 现在总共

所以我得到了一个树形图,我在其中添加了来自随机生成器的课程,名称是一致的,但顺序不是。例如,我得到了这些:

List-course=new-ArrayList();
课程。添加(“COP2210”);
课程。添加(“COP2250”);
添加(“ENC1250”);
课程。添加(“MLP1337”);
添加(“ENC3250”);
课程。添加(“REL2210”);
添加(“MUS3200”);
添加(“PHI1240”);
添加(“SOL5000”);
添加(“HAL9000”);
现在总共有十门课,下面的代码可以计算其中一门课,这意味着我必须再写九个int变量,然后再重复if语句九次,这是不可取的。我应该提到树映射在一个循环中,每次都会重置,这是我想要的。但是第二个树形图可以在循环之外添加课程,我对此没有异议。但完全有可能的是,有些课程甚至从未添加到树形图中,因为它们是从上述十个课程中随机选择的

for(int i=0;i

Order是一个大小为3的整数数组。如果存储了一个随机数,那么它将用于从课程列表中选择一个与课程相对应的位置。

每当您需要对许多不同的值执行相同类型的操作时,它应该提示您不要使用单个变量,而是使用数组或集合

你想知道每门课程的学生人数。因此,您可以使用从课程名称到该课程学生人数的映射,而不是为每门课程保留一个变量(如果有15门课程,会发生什么?100?)

在本例中,由于您已经在处理课程的索引,而不是它们的名称,所以实际上可以使用数组来处理

int[] studentCounts = new int[course.size()];
当然,这将在循环之外声明。在此数组中,
studentCounts[0]
将是索引为0的课程中的学生人数(“COP2210”)
studentCounts[1]
将是课程索引1(“COP2250”)中的学生人数,依此类推

因此,如果您的
顺序
数组是,例如,
{3,5,9}
,那么您需要增加
学生计数[3]
学生计数[5]
学生计数[9]

for ( int courseIndex : order ) {
    studentCounts[courseIndex]++;
}
您的第二个问题是,您希望按字母顺序打印为每个学生选择的课程名称。为此,可以使用
TreeMap
,但没有理由使用映射-实际上您并没有使用映射的值,只是使用键。因此
树集
将更有意义

所以如果你申报

TreeSet<String> sortedCourseNames = new TreeSet<>();
集合
的迭代器比
映射
简单。您可以直接获取字符串:

StringBuilder sb = new StringBuilder();
sb.append(ID_PREFIX)
  .append(i)
  .append(',')
  .append(student.get(i))
  .append(' ');

for ( String courseName : sortedCourseNames ) {
    sb.append(courseName)
      .append(' ');
}

students.add( sb.toString() );

因此,请注意:

  • Java有编码约定。类型名称(类、接口、枚举)应以大写字母开头(例如,
    BigPicture
    )。方法、变量和字段名称应以小写字母开头(例如,
    bigPicture
    ),常量应全部大写(例如,
    BIG\u PICTURE
    )。因此,像
    SortedCourses
    这样的变量名是不好的,
    HAL9000students
    ID\u prefix
    也是不好的。我假设ID前缀是一个常量(声明为
    static final String
    ),因此
    ID\u prefix
    是正确的名称。但是如果它是一个变量,它应该是
    idPrefix
  • 不要使用原始类型。在不使用基类型的情况下,切勿将任何内容声明为
    列表
    树映射
    等。它必须是
    列表
    树状图
    集合
    等等。正确使用泛型对于类型安全非常重要,它可以节省您的铸造时间。所以不要忽略编译器给你的关于“原始类型”的警告
  • 在我的解决方案中,不需要比较字符串。但是如果需要比较字符串,可以通过
    str1.equals(str2)
    ,而不是
    str1==str2
  • 不要使用运算符
    +
    在循环中连接字符串。对于像
    a=“foo”+b+“bar”
    这样的东西来说,它已经足够好了——一个单一的字符串连接。但在一个循环中:

    String result = "";
    for (i = 1; i < 5; i++) {
        result = result + " something else ";
    }
    
    字符串结果=”;
    对于(i=1;i<5;i++){
    结果=结果+其他东西;
    }
    
    创建和丢弃的对象太多。如我所示,最好使用
    StringBuilder


可能不是最有效的,但我会在列表上做一个for循环,并在hashMap中收集计数您甚至试图用
树映射实现什么?这没有任何意义。您是否正在尝试查看
订单[0]
订单[1]
订单[2]
是否都是
“HAL9000”
?树形图无论如何都帮不了你。而且,
==
String result = "";
for (i = 1; i < 5; i++) {
    result = result + " something else ";
}