gpt4 book ai didi

java - 有没有更有效的方法来计算带有 TreeMap 的字符串实例?

转载 作者:行者123 更新时间:2023-11-30 10:55:16 25 4
gpt4 key购买 nike

所以我得到了一个树状图,我向其中添加了来自随机生成器的类(class),名称一致但顺序不同。例如我得到了这些:

List course = new ArrayList();             
course.add("COP2210");
course.add("COP2250");
course.add("ENC1250");
course.add("MLP1337");
course.add("ENC3250");
course.add("REL2210");
course.add("MUS3200");
course.add("PHI1240");
course.add("SOL5000");
course.add("HAL9000");

现在总共有十门类(class),虽然下面的代码可以算出其中一门,但这意味着我必须再编写大约九个 int 变量并再重复 if 语句九次,这是不希望的。我应该提到树状图在一个循环中并且每次都会重置,这是我想要的。但是可以在循环外制作第二个 TreeMap 来添加类(class),我对此没有意见。但完全有可能有些类(class)甚至从未添加到树状图中,因为它们是从以上十个类(class)中随机选择的。

for (int i = 0; i < NumberOfStudents; ++i){

order = RandomCourse();

TreeMap<String, Integer> tmap = new TreeMap<String, Integer>();
tmap.put(courses.get(order[0]).toString(), 0);
tmap.put(courses.get(order[1]).toString(), 0);
tmap.put(courses.get(order[2]).toString(), 0);


String comparator1 = courses.get(order[0]).toString();
String comparator2 = courses.get(order[1]).toString();
String comparator3 = courses.get(order[2]).toString();

if(comparator1 == "HAL9000" || comparator2 == "HAL9000" || comparator3 == "HAL9000")
HAL9000students++;




courses.indexOf(order[0]);

//Clean variable
SortedCourses = "";

//Map logic
Set set = tmap.entrySet();
Iterator iterator = set.iterator();
while(iterator.hasNext()) {
Map.Entry mentry = (Map.Entry)iterator.next();
SortedCourses = SortedCourses + mentry.getKey() + " ";

}

students.add(ID_Prefix + i+ ", " + student.get(i) + " " + SortedCourses);
}

Order 是一个大小为 3 的 int 数组。其中存储了一个随机数,然后用于从类(class)列表中选择与类(class)对应的位置。

最佳答案

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

您想获得每门类(class)的学生人数。因此,您可以使用从类(class)名称到该类(class)学生人数的映射,而不是为每门类(class)保留一个变量(如果有 15 门类(class)会怎样?100 门?)。

在这种情况下,由于您已经在处理类(class)的索引而不是它们的名称,因此您实际上可以使用数组来完成。

int[] studentCounts = new int[course.size()];

当然,这将在循环外声明。在这个数组中,studentCounts[0]将是索引为 0 的类(class)中​​的学生人数(“COP2210”)。 studentCounts[1]将是类(class)索引 1(“COP2250”)中的学生人数,依此类推。

因此,如果您的 order例如,数组是 {3,5,9} , 那么你需要递增 studentCounts[3] , studentCount[5]studentCount[9] :

for ( int courseIndex : order ) {
studentCounts[courseIndex]++;
}

您的第二个问题是您想要打印为每个学生选择的类(class)名称,并按字母顺序排列。您使用 TreeMap为此,但没有理由使用 map ——你实际上并没有使用 map 的值,只是键。所以一个TreeSet会更有意义。

所以如果你声明

TreeSet<String> sortedCourseNames = new TreeSet<>();

你可以在上面的循环中添加:

for ( int courseIndex : order ) {
studentCounts[courseIndex]++;
sortedCourseNames.add( course.get(courseIndex) );
}

A Set有一个比 Map 更简单的迭代器.您可以直接获取字符串:

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 有编码约定。类型名称(类、接口(interface)、枚举)应以大写字母开头(例如 BigPicture )。方法、变量和字段名称应以小写字母开头(例如 bigPicture ),常量应全部大写(例如 BIG_PICTURE )。所以像 SortedCourses 这样的变量名不好,HAL9000students 也是和 ID_prefix .我假设 ID 前缀是一个常量(声明为 static final String ),所以 ID_PREFIX是正确的名字。但如果它是一个变量,它应该是idPrefix .
  • 使用原始类型。切勿将任何内容声明为 List , TreeMap等,而不使用基类型。必须是 List<String> , TreeMap<String,Integer> , Set<Map.Entry<String,Integer>>等等。正确使用泛型对于类型安全很重要,它可以节省转换时间。所以不要忽视编译器给你的那些关于“原始类型”的警告!
  • 在我的解决方案中,您不需要比较字符串。但是如果你需要比较字符串,你可以通过 str1.equals(str2) 来完成。 , 不是 str1 == str2 .
  • 不要使用运算符 +在循环中连接字符串。对于 a = "foo " + b + "bar" 这样的东西已经足够好了- 单个字符串连接。但是在一个循环中:

    String result = "";
    for (i = 1; i < 5; i++) {
    result = result + " something else ";
    }

    创建和丢弃的对象太多。最好使用 StringBuilder正如我所展示的。

关于java - 有没有更有效的方法来计算带有 TreeMap 的字符串实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33398256/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com