iteye_7642
2008-12-23 00:25 阅读 508
已采纳

java中能将字符串赋给枚举类型吗?怎样用switch代替if-else?

想简化下面的代码,用switch语句代替if语句来提高效率,但是不知道switch()括号中的判别式怎么写,请各位帮忙,谢谢!
public void Text_identify(File f) {
HashMap GlobalMode = new HashMap();
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=对应值;..

[b]问题补充:[/b]
不能用switch,那有没有其他简单高效的方法来代替如此多重复的if-else呢?
[b]问题补充:[/b]
我试着用enum了,但是不知道怎么把字符串赋给enum,还有就是switch中的判别式不知道如何写,能否详细说一下呢?谢谢!
[b]问题补充:[/b]
1. 代码里变量booktitle, title, author, year, isbn是用来存放他们的对应值,在其他方法里也用到了
2. Java代码
String[] input = readAllFile(f).replaceAll(" ", ";").split(";"); 这里replace完再split确实没必要,我已经按你的方法修改了。
3. globalMode最后要返回给方法调用者,我最后想要的是:可以自己定义booktitle, title, author, year, isbn对应值的显示顺序。像参考文献那样的格式。

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

11条回答 默认 最新

  • 已采纳
    dch1287 dch1287 2008-12-23 19:56

    不用switch的那个方法稍作修改
    [code="java"]
    public void textIdentify(File f)
    {
    HashMap globalMode = new HashMap();
    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]);
            }
        }
    }
    

    [/code]

    有点疑问的地方
    1. 你的代码里变量booktitle, title, author, year, isbn分别是做什么用处的, 如果仅这个方法里面用, 那么可以想我那样, 直接不用.
    2. [code="java"]String[] input = readAllFile(f).replaceAll(" ", ";").split(";");[/code]
    这里replace完再split是否有必要, 是否可以直接
    [code="java"]String[] input = readAllFile(f).split("" "");[/code]
    3. [code="java"]String re = input[i].replace(",", " ").trim();[/code]

    2,3两个代码我觉得比较奇怪, 不过你可能有你自己的意图啦.

    点赞 评论 复制链接分享
  • lggegegmail lggegegmail 2008-12-23 09:34

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

    所以, 你的不可以用switch

    点赞 评论 复制链接分享
  • lggegegmail lggegegmail 2008-12-23 10:23

    [code="java"] private Map 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);
    }[/code]
    

    只会比你复杂, 没有你的简单.

    点赞 评论 复制链接分享
  • iteye_15376 iteye_15376 2008-12-23 12:37

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

    点赞 评论 复制链接分享
  • dch1287 dch1287 2008-12-23 19:46

    你的这个情况用 enum 和 switch 不太现实

    试了试 大概也就这样了
    [code="java"]
    private final static Map 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]);
            }
        }
    }
    

    [/code]

    1. 用switch并不能提高效率
    2. 你的关键判断 re.startsWith("XXXXX") 本身无法转程enum 从而使用switch 如果换成我的 reSplited[0] 然后再弄成enum仍然很麻烦, 我认为没必要那样写
    点赞 评论 复制链接分享
  • dch1287 dch1287 2008-12-23 19:47

    用enum和switch大概是这个样子的
    [code="java"]
    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.
            }
        }
    }
    

    [/code]

    点赞 评论 复制链接分享
  • dch1287 dch1287 2008-12-23 19:58

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

    点赞 评论 复制链接分享
  • dch1287 dch1287 2008-12-23 20:01

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

    再做修改 :D

    [code="java"]if ("Author".equals(key))[/code]
    改成
    [code="java"]if ("author".equals(key))[/code]

    点赞 评论 复制链接分享
  • dch1287 dch1287 2008-12-23 20:02

    [code="java"]if (key == "Author")[/code]
    改成
    [code="java"]if ("author".equals(key)) [/code]
    :wink: :wink:

    点赞 评论 复制链接分享
  • dch1287 dch1287 2008-12-23 20:03

    低级错误了 呵呵呵呵

    点赞 评论 复制链接分享
  • u011537602 不良校长 2008-12-23 22:30

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

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

    点赞 评论 复制链接分享

相关推荐