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前缀是一个常量(声明为ID\u prefix
),因此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
树映射实现什么?这没有任何意义。您是否正在尝试查看订单[0]
、订单[1]
和订单[2]
是否都是“HAL9000”
?树形图无论如何都帮不了你。而且,==
String result = "";
for (i = 1; i < 5; i++) {
result = result + " something else ";
}