Сгруппируйте несколько строк в общую в Java - PullRequest
0 голосов
/ 09 февраля 2012

Я должен сгруппировать несколько строк в одну для сравнения. Эта группировка должна быть сделана в точности как парадигма Java OO: строка, которая «описывает» подстроку. Пример:

String one = "hammer";
String two = "screwdriver";
String three = "pliers";

Теперь предположим, что вы хотите «описать» их:

String str = "tool"

Все строки выше являются инструментами. Теперь мой код содержит строку 1, 2, 3 и превращает их в «инструмент». Так, например, строка один становится инструментом, то же самое для строки два и строки три. Как их «классифицировать»? Еще один расширенный пример:

String one = "hammer"
String two = "screwdriver";
String three = "pliers";
String four = "horse";
String five = "cat";
String six = "dog";

public void stringConverter(String str)
{
    if ("string match to an animal")
        str = "animal";
    if ("string match to a tool")
        str = "tool";
}

Может быть, это глупо реализовывать, но сейчас у меня нет идей! Спасибо!

edit: моя группа ограничена, я знаю, что у меня есть только кошка, собака, лошадь, молот и т. Д. edit2: трудно выразить меня! Это должно быть что-то вроде:

Group Animal = {cat, dog, horse}
Group Tools = {hammer, screwdriver}

// methods to recognize to wich one of the two groups is categorizable

Карта - хорошая идея, но ее нужно заполнять при каждом запуске. Есть ли что-то статичное, например, записывать их прямо в фигурные скобки? Это должно быть что-то вроде enums, но никогда раньше не использовалось!

Ответы [ 4 ]

6 голосов
/ 09 февраля 2012

Я бы начал что-то вроде этого.

public class Category
{
    private final String name;
    private final Set<String> items;

    public Category(String name)
    {
        this.name = name;
        this.items = new HashSet<String>();
    }

    public String getName()
    {
        return name;
    }

    public void add(String... items)
    {
        for (String item : items)
        {
            this.items.add(item);
        }
    }

    public boolean contains(String item)
    {
        return this.items.contains(item);
    }
}

Затем

Category tools = new Category("tool");
tools.add("hammer", "screwdriver", "pliers");

Category animals = new Category("animal");
animals.add("horse", "dog", "cat");

И, наконец,

// Guava for brevity
List<Category> categories = Lists.newArrayList(tools, animals);

public void stringConverter(String str)
{
    for (Category c : categories)
    {
        if (c.contains(str)) return c.getName();
    }

    return "not found";
}
1 голос
/ 09 февраля 2012

Есть много способов снять шкуру с этой кошки (npi;) - вот один из подходов.Аннотации - это еще один способ. (Например, Категория - это тип аннотации с целевым типом поля и т. Д.) Очевидно, что механизм сравнения не делается ниже, но это тривиально.

public enum Category {
    animal, tool
}
public interface Categorized {
    Category getCategory();
}
public enum FarmAnimals implements Categorized {
    dog, cat, horse, rabbit;
    public Category getCategory() {
        return Category.animal;
    }
}
public enum GarageTools implements Categorized {
    screwdriver, drill, wrench;
    public Category getCategory() {
        return Category.tool;
    }
}

[edit: естественноваши перечисления могут быть в виде собаки ("Собака") и т. д., если вам нужны встроенные пробелы и т. д.]

1 голос
/ 09 февраля 2012

Создайте Map строки сопоставления для их "категории".

Map<String, String> category = new HashMap<String, String>();
category.put("hammer", "tool");
category.put("screwdriver", "tool");
category.put("horse", "animal");

, а затем просто используйте category.get(str), чтобы получить категорию.

Если они статические,вы, вероятно, лучше всего обслуживаете Guava ImmutableMap , возможно, используя его синтаксис компоновщика.

1 голос
/ 09 февраля 2012

Используйте Map<String, String>, где ключами карты являются ваши 6 строк, а значение равно либо "animal", либо "tool". Используйте map.get(str), чтобы получить тип строки.

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