Как использовать enum для привязки 1 или более «неформатированных» строк к одной отформатированной? - PullRequest
0 голосов
/ 04 марта 2019

У меня есть набор неформатированных строк, которые мне нужно отформатировать.У меня есть полный список для обоих.

Вот его подмножество:

"in room"     => "ROOM"
"in big room" => "BIG ROOM"
"in building" => "BUILDING"
"in street"   => "STREET"
"in house"    => "STANDARD"
"Room box"    => "ROOM"
"Big room box"=> "BIG ROOM"
"Street box"  => "STREET"
"Box"         => "STANDARD"
default value => "STANDARD"

Мне сказали использовать enum, чтобы у меня не было тонн if s, но я не уверен, как это поможет.Мое перечисление будет выглядеть примерно так:

public enum BoxLocation {
  STANDARD("STANDARD"),
  ROOM("ROOM"),
  BIG_ROOM("BIG ROOM"),
  ...

Но я не понимаю, как это поможет избежать множества ifs.

Как мне связать одно или несколько (никогда не более 2кроме значения по умолчанию) неформатированные строки в форматированную строку, какой самый чистый путь?Я думал что-то вроде:

if(boxLocation.equals("in room") || boxLocation.equals("Room box"))
    boxLocation = BoxLocation.ROOM;

Но тогда как это помогает иметь перечисление, я не могу просто использовать это?

boxLocation = "ROOM";

РЕДАКТИРОВАТЬ: Некоторые отформатированные значения имеют пробелы, что меняет вещи с перечислениями.Я редактировал список.

Ответы [ 4 ]

0 голосов
/ 04 марта 2019

Ваше перечисление должно выглядеть следующим образом:

public enum BoxLocation{
    ROOM("ROOM","in room", "Room box"),
    BUILDING("BUILDING","in building"),
    STREET("STREET","in street", "Street box"),
    STANDARD("STANDARD","in house"),
    BIG_ROOM("BIG ROOM", "in big room");

    private final List<String> values;

    BoxLocation(String ...values) {
        this.values = Arrays.asList(values);
    }
    public List<String> getValues() {
        return values;
    }
    public static String find(String name) {
        for (BoxLocation bl : BoxLocation.values()) {
            if (bl.getValues().contains(name)) {
                return bl.values.get(0);
            }
        }
        return BoxLocation.STANDARD.values.get(0);
    }
}

и извлекать соответствующее значение для любой строки, используя метод поиска

public static void main(String[] args) {
    String boxLoc = BoxLocation.find("xyz");
    System.out.println(boxLoc);
}
0 голосов
/ 04 марта 2019

Вы можете использовать что-то вроде этого, предполагая, что перечисление выбрано, если имя перечисления содержится в слове в предложении:

public enum BoxLocation {
    ROOM, BUILDING, STREET, STANDARD, BIG_ROOM;

    private final Pattern pattern = Pattern.compile(
        name().replace('_', ' '), // take care of underscores
        Pattern.CASE_INSENSITIVE
    );

    public static BoxLocation fromValue(String sentence) {
        for (BoxLocation value : BoxLocation.values()) {
            if (value.pattern.matcher(sentence).find()) {
                return value;
            }
        }
        return STANDARD;
    }
}

Которое затем можно назвать так:

BoxLocation boxLoc = BoxLocation.fromValue("In room");

Этот подход использует разные Pattern (класс, используемый для регулярных выражений в java) для каждого перечисления, его регулярное выражение будет выглядеть так: /enumname/i, где enumname - это имя перечисления, а i - флаг без учета регистра.

0 голосов
/ 04 марта 2019

Вам нужно ввести какое-то поле свойства в свой Enum, поверх ключа;что-то вроде этого:

public enum BoxLocation {

    ROOM("in room"), 
    BUILDING("in building"), 
   ...

    private String definition;

    BoxLocation(String definition) {
        this.definition = definition;
    }
}

Затем в своем коде вы можете сделать так:

boxLocation.getDefinition().equals("in room")
Or (BoxLocation.from("in room"))

См. также сообщение Тома выше и http://tutorials.jenkov.com/java/enums.html#enum-valueof для получения дополнительных указателей

0 голосов
/ 04 марта 2019

То, что вы можете попытаться сделать с enum s, сравнивает String содержимое с String представлением enum значений, например:

public class Solution {

    public static void main(String[] args) {
        String boxLocation = "in room";

        if (boxLocation.toUpperCase().contains(Locations.ROOM.toString())) {
            System.out.println("The box is in the room");
        } else {
            System.err.println("The box is not in the room");
        }
    }

    enum Locations {
        ROOM,
        BUILDING,
        STREET
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...