-
java中能将字符串赋给枚举类型吗?怎样用switch代替if-else?10
想简化下面的代码,用switch语句代替if语句来提高效率,但是不知道switch()括号中的判别式怎么写,请各位帮忙,谢谢!
public void Text_identify(File f) {
HashMap<String, String> GlobalMode = new HashMap<String, String>();
String[] input = readAllFile(f).replaceAll(" ", ";").split(";");
for (int i = 0; i < input.length; i++) {
String re = input[i].replace(",", " ").trim();
if (re.startsWith("Book Title")) {
booktitle = input[i].substring(input[i].indexOf("-") + 2);
GlobalMode.put("booktitle", booktitle);
contiue;
}
if (re.startsWith("Chapter Title")) {
title = input[i].substring(input[i].indexOf("-") + 2);
GlobalMode.put("title", title);
contiue;
}
// 多个作者识别
if (re.startsWith("Author")) {
StringBuffer au = new StringBuffer();
author = au.append(input[i].substring(input[i].indexOf("-") + 2)).toString();
String authorNames = GlobalMode.get("author");
authorNames = (authorNames == null) ? author : (authorNames + "," + author);
GlobalMode.put("author", authorNames);
contiue;
}
if (re.startsWith("Copyright")) {
year = input[i].substring(input[i].indexOf("-") + 2);
GlobalMode.put("year", year);
contiue;
}
if (re.startsWith("isbn")) {
isbn = input[i].substring(input[i].indexOf("-") + 2);
GlobalMode.put("isbn", isbn);
contiue;
}
}
补充:目的是处理这样的文本:
Book Series -
Book Title - Graph Drawing
Chapter Title - VGJ: Visualizing Graphs Through Java
First Page - 454
Last Page - 455
Copyright - 1998
Author - Carolyn McCreary
Author - Larry Barowski
识别BookTitle = 对应值;author=对应值;..
问题补充:
不能用switch,那有没有其他简单高效的方法来代替如此多重复的if-else呢?
问题补充:
我试着用enum了,但是不知道怎么把字符串赋给enum,还有就是switch中的判别式不知道如何写,能否详细说一下呢?谢谢!
问题补充:
1. 代码里变量booktitle, title, author, year, isbn是用来存放他们的对应值,在其他方法里也用到了
2. Java代码
String[] input = readAllFile(f).replaceAll(" ", ";").split(";"); 这里replace完再split确实没必要,我已经按你的方法修改了。
3. globalMode最后要返回给方法调用者,我最后想要的是:可以自己定义booktitle, title, author, year, isbn对应值的显示顺序。像参考文献那样的格式。
2008年12月23日 00:25
11个答案 按时间排序 按投票排序
-
采纳的答案
不用switch的那个方法稍作修改
public void textIdentify(File f) { HashMap<String, String> globalMode = new HashMap<String, String>(); String[] input = readAllFile(f).replaceAll(" ", ";").split(";"); for (int i = 0; i < input.length; i++) { String re = input[i].replace(",", " ").trim(); String[] reSplited = re.split(" - "); String key = KEY_MAP.get(reSplited[0]); if (key == "Author") { String authorNames = globalMode.get(key); authorNames = (authorNames == null) ? reSplited[1] : (authorNames + "," + reSplited[1]); globalMode.put(key, authorNames); } else { globalMode.put(key, reSplited[1]); } } }
有点疑问的地方
1. 你的代码里变量booktitle, title, author, year, isbn分别是做什么用处的, 如果仅这个方法里面用, 那么可以想我那样, 直接不用.
2.String[] input = readAllFile(f).replaceAll(" ", ";").split(";");
这里replace完再split是否有必要, 是否可以直接String[] input = readAllFile(f).split("" "");
3.String re = input[i].replace(",", " ").trim();
2,3两个代码我觉得比较奇怪, 不过你可能有你自己的意图啦.
2008年12月23日 19:56
-
说几个我的观点,
1)if/switch在java6下是没有差别的, 在JAVA5才有差别, 而且不小。
2)另外, startsWith其实性能还是很高的, 以你的情况, 比较一个字符就出结果的。
楼上puroc的方法给的很好, 我也是这么类似做的。
除非你对性能有极高的要求, 我不建议你使用这么复杂的做法, 除非你做类似html分析之类事情, 处理tag的要求高。2008年12月23日 22:30
-
不用switch的那个方法稍作修改
后
再做修改
if ("Author".equals(key))
改成if ("author".equals(key))
2008年12月23日 20:01
-
用enum和switch大概是这个样子的
static enum KeyEnum { booktitle, title, author, year, isbn } private final static Map<String, KeyEnum> KEY_MAP; static { KEY_MAP = new HashMap<String, KeyEnum>(); KEY_MAP.put("Book Title", KeyEnum.booktitle); KEY_MAP.put("Chapter Title", KeyEnum.title); KEY_MAP.put("Author", KeyEnum.author); KEY_MAP.put("Copyright", KeyEnum.year); KEY_MAP.put("isbn", KeyEnum.isbn); } public void textIdentify(File f) { HashMap<String, String> globalMode = new HashMap<String, String>(); String[] input = readAllFile(f).replaceAll(" ", ";").split(";"); for (int i = 0; i < input.length; i++) { String re = input[i].replace(",", " ").trim(); String[] reSplited = re.split(" - "); KeyEnum key = KEY_MAP.get(reSplited[0]); switch (key) { case booktitle: globalMode.put(KeyEnum.booktitle.name(), reSplited[1]); break; case title: globalMode.put(KeyEnum.title.name(), reSplited[1]); break; case author: String authorNames = globalMode.get(key.name()); authorNames = (authorNames == null) ? reSplited[1] : (authorNames + "," + reSplited[1]); globalMode.put(key.name(), authorNames); break; case year: globalMode.put(KeyEnum.year.name(), reSplited[1]); break; case isbn: globalMode.put(KeyEnum.isbn.name(), reSplited[1]); break; default: // do nothing here. } } }
2008年12月23日 19:47
-
你的这个情况用 enum 和 switch 不太现实
试了试 大概也就这样了private final static Map<String, String> KEY_MAP; static { KEY_MAP = new HashMap<String, String>(); KEY_MAP.put("Book Title", "booktitle"); KEY_MAP.put("Chapter Title", "title"); KEY_MAP.put("Author", "author"); KEY_MAP.put("Copyright", "year"); KEY_MAP.put("isbn", "isbn"); } public void textIdentify(File f) { HashMap<String, String> globalMode = new HashMap<String, String>(); String[] input = readAllFile(f).replaceAll(" ", ";").split(";"); for (int i = 0; i < input.length; i++) { String re = input[i].replace(",", " ").trim(); String[] reSplited = re.split(" - "); if (reSplited[0] == "Author") { String authorKey = KEY_MAP.get(reSplited[0]); String authorNames = globalMode.get(authorKey); authorNames = (authorNames == null) ? reSplited[1] : (authorNames + "," + reSplited[1]); globalMode.put(authorKey, authorNames); } else { globalMode.put(KEY_MAP.get(reSplited[0]), reSplited[1]); } } }
1. 用switch并不能提高效率
2. 你的关键判断 re.startsWith("XXXXX") 本身无法转程enum 从而使用switch
如果换成我的 reSplited[0] 然后再弄成enum仍然很麻烦, 我认为没必要那样写2008年12月23日 19:46
-
private Map<String, String> GlobalMode; /** * name 和 key 的关系对应 */ private String[][] nameKeys = { { "Book Title", "booktitle" }, { "Chapter Title", "title" }, { "Author", "author" }, { "Copyright", "year" }, { "isbn", "isbn" } }; /** * <p>Description: 从一个项目得到key. 比如:从"Book Title - 对应值" 得到 "Book Title" 对应的 "booktitle" </p> */ private String getKey(String item) { String name = item.substring(0, item.indexOf("-")).trim(); for (int i = 0; i < nameKeys.length; i++) { String[] nameItem = nameKeys[i]; if (name.equals(nameItem[0])) { return nameItem[1]; } } return null; } /** * <p>Description: 从一个项目得到value. 比如:从"Book Title - 对应值" 得到 "对应值" </p> */ private String getValue(String item) { return item.substring(item.indexOf("-") + 1).trim(); } private void initParse() { GlobalMode = new HashMap<String, String>(); } private void parseConent(String content) { String[] input = content.split(";"); for (String item : input) { String value = getValue(item); String key = getKey(item); if (key.equals("author")) { if (GlobalMode.get(key) != null) { value = GlobalMode.get(key) + value; } } GlobalMode.put(key, value); } } public static void main(String[] args) { A a = new A(); a.initParse(); a.parseConent("Book Title - 对应值; Author - 对应值;"); System.out.println(a); }
只会比你复杂, 没有你的简单.2008年12月23日 10:23
相关推荐
1. **Java基础知识**:教程可能会从Java的基础开始讲解,包括变量、数据类型、运算符、流程控制(如if-else、switch、for、while循环)、方法定义和调用,以及数组的使用。 2. **类与对象**:Java是面向对象的语言...
- **注意事项**: `long`类型不被支持,可以考虑使用`if-else`结构代替。 **6. shorts1=1;s1=s1+1;有什么错?shorts1=1;s1+=1;有什么错?** - **知识点**: `s1 = s1 + 1`会导致编译错误,因为`1`是`int`类型,默认...
encodeURIComponent 方法 将文本字符串编码为合法的通用资源标识符 (URI)组件。 Enumerator 对象 提供集合中的项的枚举。 相等运算符(==) 比较两个表达式,看是否相等。 Error 对象 包含在运行 JScript 代码时...
从Java 7开始,`switch`支持字符串类型。 **6. shorts1=1;s1=s1+1;有什么错?shorts1=1;s1+=1;有什么错?** 在`shorts1=1;s1=s1+1;`这行代码中,因为`+`操作符的两侧都是`short`类型,但`1`是`int`类型的默认值,...
2. **Java语法基础**:包括数据类型(基本类型和引用类型)、变量、常量、运算符、流程控制(如if-else,switch,for,while循环)以及方法的定义和调用。 3. **类与对象**:讲解面向对象编程的基础,包括类的定义...
encodeURIComponent 方法 将文本字符串编码为合法的通用资源标识符 (URI)组件。 Enumerator 对象 提供集合中的项的枚举。 相等运算符(==) 比较两个表达式,看是否相等。 Error 对象 包含在运行 JScript 代码时...
encodeURIComponent 方法 将文本字符串编码为合法的通用资源标识符 (URI)组件。 Enumerator 对象 提供集合中的项的枚举。 相等运算符(==) 比较两个表达式,看是否相等。 Error 对象 包含在运行 JScript 代码时...
30053 分段计算水费(使用嵌套的if-else语句) 31 第6周(M6) 32 40011 求最小公倍数和最大公约数(调试示例error04_1) 32 40012 求1-1/4+1/7-1/10+1/13-1/16+…… 33 40014 求整数的位数 34 40023 换硬币 ...
1. **Java语法**:掌握Java的基础语法,包括变量声明、数据类型(原始类型和引用类型)、运算符、流程控制(if-else,switch,for,while,do-while)和循环控制语句。 2. **类与对象**:理解面向对象编程的基本...
- C语言的语法结构包括变量声明、常量定义、运算符、流程控制语句(如if-else、switch-case、for、while、do-while)等。 - 数据类型包括基本类型(如int、char、float、double)、复合类型(如struct、union)、...
以上是计算机二级C语言考试中涉及的关键知识点,包括控制结构(如`switch`、`do-while`、`for`循环)、类型转换、函数使用、变量作用域和生存期、指针与数组操作以及字符串处理。在备考过程中,考生需要重点掌握这些...
- 使用空字符`\0`来标记字符串的结束。 ### 7. 查找数组中的最大值及其下标 ```c void fun(int *s, int t, int *k) { int I, max; max = s[0]; for (i = 0; i ; i++) if (s[i] > max) { max = s[i]; *k = i...
1. **基础语法**:包括变量、常量、数据类型、运算符、控制结构(如if-else、switch-case、for、while等)、流程控制、错误与异常处理等。 2. **字符串和数组**:详细解释了如何创建、操作和遍历字符串和数组,以及...
### 2012年3月全国计算机二级C语言笔试知识点解析 #### 一、选择题解析 ...- **解析:** 在C语言中,switch语句的表达式必须是整型,因此选项C是正确的,因为它使用了(int)类型转换,确保表达式的结果是整数。
- **解析:**首先执行`b=4`,然后执行`c=2`,最后将这两个值相加赋给`a`,即`a=6`。 **10. 字符串"ab\034\\\x79"的长度为______。** - **答案:6** - **解析:**字符串中的转义字符`\034`和`\x79`只占据一个位置,...
1. **基本语法**:C语言的基础包括变量、数据类型(如int、char、float等)、运算符(算术、比较、逻辑、位操作等)、流程控制(if-else、switch-case、for、while等)。 2. **函数**:理解函数的定义、调用、参数...
3. **流程控制**:包括条件语句(if...else,switch)和循环结构(for,while,do...while)。通过这些语句,我们可以根据条件执行不同的代码块,或重复执行某段代码。 4. **函数**:JavaScript中的函数是一等公民...
字符串可以使用双引号(")或单引号(')定义,双引号中的变量会被解析,而单引号则不会。数组的创建方式多样,可以是索引数组,也可以是关联数组,例如:$bo = array(1, 2, 3)和$bo = array("A" => 1, "B" => 2)。 ...
5. **选择结构程序设计**:涵盖关系和逻辑运算符,if、if...else、switch语句,重点是理解和应用这些条件控制结构,难点是关系和逻辑运算符的判断,以及if语句的嵌套。 6. **循环控制**:介绍goto、for、while和do....