簡體   English   中英

有沒有辦法將開關與String.contains(“”)集成?

[英]is there a way to integrate a switch with String.contains(“”)?

我需要檢查一個String對象是否包含()各種子串,並根據結果執行不同的代碼片段。 目前我有一系列的其他如果。 如果可能的話我想把它轉換成一個開關。 有沒有辦法做到這一點?

目前:

 if (SomeString.contains("someSubString")) {

    . . . do something

 } else if (SomeString.contains("anotherSubString")) {

    . . . do something else

 } else if (SomeString.contains("yetanotherSubString")) {

    . . . do something even more different

 }  
 .
 .
 .

當我遇到這樣的情況,並且真的不想使用else if ,我會這樣做:

String[] cases = {"someSubString", "anotherSubString", "yetanotherSubString"};

int i;
for(i = 0; i < cases.length; i++)
    if(SomeString.contains(cases[i])) break;

switch(i) {
    case 0: //someSubString
        System.out.println("do something");
    break;
    case 1: //anotherSubString
        System.out.println("do something else");
    break;
    case 2: //yetanotherSubString
        System.out.println("do something even more different");
    break;
    default:
        System.out.println("do nothing");
}

當然,這有一些缺點。 對於初學者來說,如果你在除了結尾之外的任何地方添加另一個字符串,所有索引都會移動,你必須手動糾正。 盡管如此,我認為我已經使用了一兩次這樣的東西,並認為它使代碼更具可讀性。 據推測,索引在程序中有一些含義,因此以對問題有意義的方式耦合0...someSubString

你不能在交換機中使用String變量,但你可以使用char,也許你所有字符串中的特定字符不同?

對於“someSubString”,“anotherSubString”和“yetanotherSubString”,您可以使用以下內容:

switch(SomeString.chatAt(0)) {
    case 's':
    case 'a':
    case 'y':
}

但這只有在知道字符串的所有可能值並且特定位置的字符在所有字符串上不同時才有效。

在Java 7中,您可以打開完整的字符串,但不能打開部分外觀。 你可以做的是處理這種情況的策略模式。

private abstract class StringProcessor {
    String pattern;

    StringProcessor(String str) {
        pattern = str;
    }

    boolean matches(String str) {
        return str.matches(pattern);
    }

    abstract void process(String str);
}

StringProcessor[] processors = new StringProcessor[] {
    new StringProcessor("patt1") {
        void process(String str) {
            // do stuff for patt1
        }
    },
    new StringProcessor("patt2") {
        void process(String str) {
            // do stuff for patt2
        }
    }

};

然后在你的方法中:

for (StringProcessor sp: processors) {
    if (sp.matches(str)) {
        sp.process(str);
        break; // Don't break if you want the option to handle all that match
    }
}

現在,您可以根據需要添加任意數量的不同StringProcessors,並且將檢查所有內容,如果匹配則將調用代碼。 在許多情況下,您可以提前預先定義處理器列表,但如果需要,您也可以動態創建它。

對於我使用的相同類型的情況如下。 首先得到了我正在尋找的所有字符串作為字符串

String str ="someSubString,anotherSubString,yetanotherSubString"

然后從上面的字符串中獲取列表

List items = Arrays.asList(str.split("\\s*,\\s*"));

現在循環上面的列表並使用包含和切換

<pre>
  for (String item : items) {
            if (mainStr.contains(item)) {
                switch (item) {
                    case "someSubString":
                        do something
                        break;
                    case "anotherSubString":
                        do something else
                        break;
                    case "yetanotherSubString":
                        do something even more different
                        break;
                }
            }
        }
</pre>

希望這會幫助那些現在正在尋找相同類型要求的人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM