Массив как параметры для переключения параметров - PullRequest
2 голосов
/ 12 ноября 2008

Я помню, как в университете я использовал переключатель с «бинарным поиском» или «двоичным переключателем». Как-то так, мой гугл фу сегодня сломан. В любом случае это происходит следующим образом: вы определяете массив возможных опций (обычно строк), происходит какое-то волшебство, и эти опции в массиве становятся случаями переключения. Я помню, что они должны были быть в алфавитном порядке, чтобы это работало. Можете ли вы помочь мне вспомнить магию? Даже имя того, на что я должен смотреть, было бы фантастическим.

Ответы [ 6 ]

10 голосов
/ 12 ноября 2008

Я думаю, что вы ищете Enum .

По ссылке выше ...

public enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, 
    THURSDAY, FRIDAY, SATURDAY 
}

public class EnumTest {

    Day day;

    public EnumTest(Day day) {
        this.day = day;
    }

    public void tellItLikeItIs() {
         switch (day) {
            case MONDAY:
                 System.out.println("Mondays are bad.");
                 break;

            case FRIDAY:
                 System.out.println("Fridays are better.");
                 break;

            case SATURDAY:
            case SUNDAY:
                 System.out.println("Weekends are best.");
                 break;

            default:
                 System.out.println("Midweek days are so-so.");
                 break;
        }
    }

    ....
}
1 голос
/ 12 ноября 2008

Вы имели в виду gperf? Или, возможно, вы имели в виду теорию (хеширование) в целом?

http://www.gnu.org/software/gperf/

0 голосов
/ 14 марта 2012

Если вы решили использовать enum и ваша коллекция enum имеет большой размер:

MAGIC:

Если вы работаете в eclipse , это сделает «магию» для вас, просто вам нужно написать следующее (учитывая принятый код ответа):

switch (day) {
}

выберите switch и нажмите Ctrl + 1 и магия работает! (все значения enum будут заполнены в секциях case вашего блока switch)

0 голосов
/ 26 февраля 2009
public enum Day {
    SUNDAY ("sundays are this"),
    MONDAY ("mondays are that"), 
    TUESDAY ("blah"), 
    WEDNESDAY ("blah"), 
    THURSDAY ("blah"), 
    FRIDAY ("blah"), 
    SATURDAY ("more blah");

    private final String tell;

    public Day(String tell){
       this.tell = tell;
    }
    public String tellItLikeItIs() {
       return this.tell;
    }
}

public class TodayIs{
    public static void main(String... args) {
         Day day = Day.valueOf(args[0].toUppercase());
         System.out.println(day.tellItLikeItIs());

Я новичок в java-перечислениях, но думаю, что это тоже должно сработать.

0 голосов
/ 26 февраля 2009

Использование Enum без переключателя выглядит так:

public enum Day {
    SUNDAY {
      public String tellItLikeItIs() {
        return "Weekends are best.";
      }
    },
    MONDAY {
      public String tellItLikeItIs() {
        return "Mondays are bad.";
      }
    }, 
    TUESDAY, 
    WEDNESDAY, 
    THURSDAY, 
    FRIDAY {
      public String tellItLikeItIs() {
        return "TGI Friday.";
      }
    }, 
    SATURDAY {
      public String tellItLikeItIs() {
        return "Weekends are best.";
      }
    }

    public String tellItLikeItIs() {
       return "Midweek days are so-so.";
    }
}

public class TodayIs{
    public static void main(String... args) {
         Day day = Day.valueOf(args[0].toUppercase());
         System.out.println(day.tellItLikeItIs());
    }
}
0 голосов
/ 12 ноября 2008

Обычно я бы не стал злоупотреблять переключателем таким образом (даже если бы мог). Попробуйте, возможно, вы не сможете заставить массивы работать в операторе switch, поскольку он допускает только постоянные значения в строках регистра. Вы уверены, что не думаете о каком-то шаблоне, подобном приведенному ниже, или перечислении?

final int RED = 0;
final int YELLOW = 1;
final int BLUE = 2;
final int GREEN = 3;

String[] colors = new String[] { "red", "yellow", "blue", "green" };

switch (color) {
    case RED:
        System.out.println(colors[RED]);
        break;
    case YELLOW:
        System.out.println(colors[YELLOW]);
        break;
    ...the rest
}
...