0 0

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个答案 按时间排序 按投票排序

0 0

采纳的答案

不用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
0 0

说几个我的观点,
   1)if/switch在java6下是没有差别的, 在JAVA5才有差别, 而且不小。
   2)另外, startsWith其实性能还是很高的, 以你的情况, 比较一个字符就出结果的。
  楼上puroc的方法给的很好, 我也是这么类似做的。

  除非你对性能有极高的要求, 我不建议你使用这么复杂的做法, 除非你做类似html分析之类事情, 处理tag的要求高。

2008年12月23日 22:30
0 0

低级错误了 呵呵呵呵

2008年12月23日 20:03
0 0

if (key == "Author")

改成
if ("author".equals(key)) 

 

2008年12月23日 20:02
0 0

不用switch的那个方法稍作修改



再做修改

if ("Author".equals(key))

改成
if ("author".equals(key))

2008年12月23日 20:01
0 0

还有一点 你的globalMode最后要返回给方法调用者不?

2008年12月23日 19:58
0 0

用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
0 0

你的这个情况用 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
0 0

用enum,然后你就可以用switch了。

2008年12月23日 12:37
0 0

	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
0 0

switch()
中间的条件只能是 int,byte,char,short

所以, 你的不可以用switch

2008年12月23日 09:34

相关推荐

    Java2 Certification last minute tutorial

    1. **Java基础知识**:教程可能会从Java的基础开始讲解,包括变量、数据类型、运算符、流程控制(如if-else、switch、for、while循环)、方法定义和调用,以及数组的使用。 2. **类与对象**:Java是面向对象的语言...

    java面试宝典 吐血推荐,很全面

    - **注意事项**: `long`类型不被支持,可以考虑使用`if-else`结构代替。 **6. shorts1=1;s1=s1+1;有什么错?shorts1=1;s1+=1;有什么错?** - **知识点**: `s1 = s1 + 1`会导致编译错误,因为`1`是`int`类型,默认...

    javascript文档

    encodeURIComponent 方法 将文本字符串编码为合法的通用资源标识符 (URI)组件。 Enumerator 对象 提供集合中的项的枚举。 相等运算符(==) 比较两个表达式,看是否相等。 Error 对象 包含在运行 JScript 代码时...

    Java面试宝典

    从Java 7开始,`switch`支持字符串类型。 **6. shorts1=1;s1=s1+1;有什么错?shorts1=1;s1+=1;有什么错?** 在`shorts1=1;s1=s1+1;`这行代码中,因为`+`操作符的两侧都是`short`类型,但`1`是`int`类型的默认值,...

    java程序设计语言的课件

    2. **Java语法基础**:包括数据类型(基本类型和引用类型)、变量、常量、运算符、流程控制(如if-else,switch,for,while循环)以及方法的定义和调用。 3. **类与对象**:讲解面向对象编程的基础,包括类的定义...

    微软JavaScript手册

    encodeURIComponent 方法 将文本字符串编码为合法的通用资源标识符 (URI)组件。 Enumerator 对象 提供集合中的项的枚举。 相等运算符(==) 比较两个表达式,看是否相等。 Error 对象 包含在运行 JScript 代码时...

    JScript 语言参考

    encodeURIComponent 方法 将文本字符串编码为合法的通用资源标识符 (URI)组件。 Enumerator 对象 提供集合中的项的枚举。 相等运算符(==) 比较两个表达式,看是否相等。 Error 对象 包含在运行 JScript 代码时...

    浙江大学C语言上机练习题附答案

    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 换硬币 ...

    SCJP考试经验和模拟题

    1. **Java语法**:掌握Java的基础语法,包括变量声明、数据类型(原始类型和引用类型)、运算符、流程控制(if-else,switch,for,while,do-while)和循环控制语句。 2. **类与对象**:理解面向对象编程的基本...

    「江苏省计算机等级考试二级C语言简介」.pdf

    - C语言的语法结构包括变量声明、常量定义、运算符、流程控制语句(如if-else、switch-case、for、while、do-while)等。 - 数据类型包括基本类型(如int、char、float、double)、复合类型(如struct、union)、...

    今年全国计算机二级C考试资料.pdf

    以上是计算机二级C语言考试中涉及的关键知识点,包括控制结构(如`switch`、`do-while`、`for`循环)、类型转换、函数使用、变量作用域和生存期、指针与数组操作以及字符串处理。在备考过程中,考生需要重点掌握这些...

    二级C语言上机南开100题

    - 使用空字符`\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] &gt; max) { max = s[i]; *k = i...

    PHP帮助文档最全面

    1. **基础语法**:包括变量、常量、数据类型、运算符、控制结构(如if-else、switch-case、for、while等)、流程控制、错误与异常处理等。 2. **字符串和数组**:详细解释了如何创建、操作和遍历字符串和数组,以及...

    2012年3月2级C语言笔试真题及答案.doc )

    ### 2012年3月全国计算机二级C语言笔试知识点解析 #### 一、选择题解析 ...- **解析:** 在C语言中,switch语句的表达式必须是整型,因此选项C是正确的,因为它使用了(int)类型转换,确保表达式的结果是整数。

    C语言经典题解(等级考试)

    - **解析:**首先执行`b=4`,然后执行`c=2`,最后将这两个值相加赋给`a`,即`a=6`。 **10. 字符串"ab\034\\\x79"的长度为______。** - **答案:6** - **解析:**字符串中的转义字符`\034`和`\x79`只占据一个位置,...

    三级c语言1机试答案

    1. **基本语法**:C语言的基础包括变量、数据类型(如int、char、float等)、运算符(算术、比较、逻辑、位操作等)、流程控制(if-else、switch-case、for、while等)。 2. **函数**:理解函数的定义、调用、参数...

    一个javascript的基础教程

    3. **流程控制**:包括条件语句(if...else,switch)和循环结构(for,while,do...while)。通过这些语句,我们可以根据条件执行不同的代码块,或重复执行某段代码。 4. **函数**:JavaScript中的函数是一等公民...

    php100视频教程学习笔记.pdf

    字符串可以使用双引号(")或单引号(')定义,双引号中的变量会被解析,而单引号则不会。数组的创建方式多样,可以是索引数组,也可以是关联数组,例如:$bo = array(1, 2, 3)和$bo = array("A" =&gt; 1, "B" =&gt; 2)。 ...

    C语言程序设计教学大纲(1122155145).pdf

    5. **选择结构程序设计**:涵盖关系和逻辑运算符,if、if...else、switch语句,重点是理解和应用这些条件控制结构,难点是关系和逻辑运算符的判断,以及if语句的嵌套。 6. **循环控制**:介绍goto、for、while和do....

Global site tag (gtag.js) - Google Analytics