Java-选课系统,java如何实现返回被同时选中最高的课

发布于 2016-11-06 18:50:40 字数 205 浏览 1119 评论 2

选课的logFile是一个字符串,如"1,math,johnn2,physics,miken3,physics,johnn"
要找出被同时选中频率最高的两门课,如上述字符串为logFIle的话,那么应该return "math,physics"
要求只用primitive type和数组,不能用数据结构。
输出的两门课要按首字母顺序排列。
请问如何实现?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

晚风撩人 2017-09-10 02:19:34

做一个存放结果的2维数组.arr[0][i]存名称,arr[1][i]存名称对应的选定数量,
然后循环解析字符串应该就ok了吧.

要是能用hashmap就好了.

浮生未歇 2017-03-07 18:07:39

看下面的代码:

主要思路:

先从命令行参数读入要解析的字符串
然后将字符串按照 n 切分成为每条记录,对这些记录做循环
对每条记录,取得其选的课,加入到一个选课列表的二维数组中,这个二维数组的每个元素表示一个科目的选课记录,每个元素的 [0] 是选这门课的人数, [1] 是这门课的名称。在加入时,如果发现已经存在了这门课的记录,则把选课人数 + 1,否则就插入一条新的记录,并且将选课人数初始化为 1.
准备好了这个列表后,首先对这个列表按照选课人数进行排序。
然后将这个按照选课人数排序完的有序数组中,所有课的名称这一列取出来
将取出来的数组中,所有空元素去除。
对取出来,按照选课人数排序的前两个课程的名称按照首字母排序

对于重复的处理

如果两门课的选中人数都是一样的,且在前两名,则这两门课会按照首字母排序
如果选中人数最多的第2门课和第3门课的人数是一样的,则这时候不能保证这两门课中,首字母考前的课出现在输出中,如果要修复这个问题,代码要做相应的修改。

import static java.lang.System.out;

public class PopularLesson {

private static int numberOfLessons = 0;

private static boolean notEmpty(String input) {
return null != input && input.length() > 0;
}

public static Object[][] getLessonsArray(String input) {
if(notEmpty(input)){
String[] ia = input.split("n");
int length = ia.length;
Object[][] result = new Object[length][2];
if(ia.length > 0) {
for (int i = 0; i < length; i++) {
String record = ia[i];
if (notEmpty(record)) {
String[] info = record.split(",");
int currentIndex = getCurrentRecordForLesson(result, info[1]);
//Not found, insert a new record
if(currentIndex == -1) {
result[i] = new Object[2];
result[i][1] = info[1];
result[i][0] = 1;
numberOfLessons++;
} else {
result[currentIndex][0] = (Integer) result[currentIndex][0] + 1;
}
}
}
}
for (int i = 0; i < result.length; i++) {
out.println("Raw: " + result[i][1] + ": " + result[i][0]);
}
return result;
}
return null;
}

//Selection sort, sort by popularity
private static Object[][] sortLessonByPopularity(Object[][] result) {
for (int i = 0; i < result.length; i++) {
if(result[i][0] != null) {
for (int j = i + 1; j < result.length; j++) {
if((result[j][0] != null)
&& ((int) result[j][0] > (int) result[i][0])) {
int temp = (int) result[j][0];
result[j][0] = result[i][0];
result[i][0] = temp;
String tempStr = (String) result[j][1];
result[j][1] = result[i][1];
result[i][1] = tempStr;
}
}
}
}
return result;
}

private static int getCurrentRecordForLesson(Object[][] lessons, String lessonName)
{
for (int i = 0; i < lessons.length; i++) {
if(notEmpty(lessonName) && lessonName.equals(lessons[i][1])) {
return i;
}
}
//Lesson haven't inserted into the array already
return -1;
}

public static String[] removeNullObjects(Object[][] r) {
String[] lessonNames = new String[numberOfLessons];
int ii = -1;
for (int i = 0; i < r.length; i++) {
if(r[i][1] != null) {
out.println("Sorted by popularity without null value: " + r[i][1] + ": " + r[i][0]);
lessonNames[++ii] = (String) r[i][1];
}
}
return lessonNames;
}

public static String[] sortLessonByAlpha(String[] lessons)
{
String[] result = null;
if(lessons.length >= 2) {
result = new String[2];
result[0] = lessons[0];
result[1] = lessons[1];
java.util.Arrays.sort(result);//sort by alpha
for (int i = 0; i < result.length; i++) {
out.println("Sorted by popularity and alpha: " + result[i]);
}
} else if (lessons.length == 1){
result = new String[1];
result[0] = lessons[0];
}
return result;
}

public static void main(String[] args) throws Exception {
String input = "1,physics,johnn2,physics,miken3,physics,johnn4,physics,Lawrencen5,art,Lawrencen6,art,Lawrencen7,art,Lawrencen8,math,Lawrencen";
if(args.length > 0 && null != args[0]) {
input = args[0];
}
Object[][] r = getLessonsArray(input);
r = sortLessonByPopularity(r);
String[] lessonWithoutNull = removeNullObjects(r);
String[] sortedByAlpha = sortLessonByAlpha(lessonWithoutNull);
outputAsRequired(sortedByAlpha);
}

private static void outputAsRequired(String[] lessons) {
if (lessons != null) {
out.println(lessons.length < 2 ?
lessons[0] : lessons[0] + "," + lessons[1]);
}
}
}

上面的代码的用法:

java PopularLesson <要解析的字符串>

如果不指定要解析的字符串参数,则默认使用下面的字符串来测试

"1,physics,johnn2,physics,miken3,physics,johnn4,physics,Lawrencen5,art,Lawrencen6,art,Lawrencen7,art,Lawrencen8,math,Lawrencen"

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文