Java - Как правильно организовать хранение пары: команда -> строки_результата

307
12 апреля 2017, 12:59

Добрый день.

Требуется хранить пары данных — список комманд и результат их выполнения.

Результат выполнения может быть в виде нескольких строк; соответственно, нужен массив. Команды могут быть не уникальными.

Напрашивается конструкция HashMap<String,ArrayList<String>>, но в этой коллекции ключ должен быть уникальным. Мне не подходит.

Подскажите, как можно реализовать.

Answer 1

Какие getKey? Что за getValue? Кто (включая автора через пару недель) этот бред разберёт?

public class CommandResultPair {
    private String command;
    private List<String> result;
    ...
    // get, set, construct...
}
...
List<CommandResultPair> crps = new ArrayList<>();
while (...) {
    String commnad = ...
    List<String> result = ...
    crps.add(new CommandResultPair(command, result));
}
...
for(CommandResultPair crp : crps) {
    String command = crp.getCommand();
    List<String> result = crp.getResult();
    ...
}
Answer 2

Сделал отдельный класс:

public class CommandResultPair {
private final String  command;
private final ArrayList<String> result;

public CommandResultPair(String command, ArrayList<String> result) {
    this.command = command;
    this.result = result;
}
public String getCommand() { return command; }
public ArrayList<String> getResult() { return result; }
@Override
public int hashCode() { return command.hashCode() ^ result.hashCode(); }
@Override
public boolean equals(Object o) {
     if (!(o instanceof CommandResultPair)) return false;
    CommandResultPair pairo = (CommandResultPair) o;
    return this.command.equals(pairo.getCommand()) &&
            this.result.equals(pairo.getResult());
}}

Так проверяю:

public class ExampleCommanResultPair {
public static void main(String[] args) {

    String str1 = "command1";
    String str2 = "command2";
    ArrayList<String> result1 = new ArrayList<String>();
    result1.add("result1_line1");
    result1.add("result1_line2");
    ArrayList<String> result2 = new ArrayList<String>();
    result2.add("result2_line1");
    result2.add("result2_line2");
    CommandResultPair cmd1 = new CommandResultPair(str1,result1);
    CommandResultPair cmd2 = new CommandResultPair(str2,result2);

    ArrayList <CommandResultPair> commandArray = new ArrayList<>();
    commandArray.add(cmd1);
    commandArray.add(cmd2);
    commandArray.add(new CommandResultPair("command3",result1));
    for (CommandResultPair cmdItr : commandArray){
        System.out.println("Result for command \"" + cmdItr.getCommand() + "\"");
        cmdItr.getResult().forEach((resultItr) -> {System.out.println( resultItr   );}     );

    }
}}

Вывод:

    Result for command "command1"
result1_line1
result1_line2
Result for command "command2"
result2_line1
result2_line2
Result for command "command3"
result1_line1
result1_line2

Вроде бы то, что нужно.

READ ALSO
Удаление из массива

Удаление из массива

Никак не могу понять этот алгоритм ,Может кто объяснит мне поэтапно

311
Все случаи когда может выскочить InterruptedException?

Все случаи когда может выскочить InterruptedException?

Существует ограниченное количество случаев когда может выскочить InterruptedExceptionПонятно что это может произойти при вызове wait() или sleep(), они...

267
Как работать с drawBitmapMesh?

Как работать с drawBitmapMesh?

Саму ее я приблизительно разобрался как сделать

277