Java программа, которая ищет элементы по тегам - PullRequest
1 голос
/ 20 марта 2020

Я хочу создать программу, которая будет искать элемент на основе тегов. Я использовал 2D-массив для размещения элемента и соответствующего тега.

            ----------------------------
             Item1 | Tags

               Cat | Pet Cute Mammal
            Burger | Food Snack Mammal
           Chicken | Animal Food Pet
            ----------------------------

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

       Example: If I entered "Pet Mammal Cute"
       This is the current output so far:
       Cat
       Cat
       Cat
       Chicken
       My goal is output like this:
       Item | Number of tags matched
       Cat  | (3)
     Chicken| (1)

Ниже мой код пока:


String [][] data={{"Cat","Pet Mammal Cute"},
                  {"Burger","Food Snack Hot"},
                  {"Chicken","Food Bird Pet"},
                  {"Ice Cream","Food Dessert Cold"},
                  {"Laptop","Gadget Device Computer"},
 };
String getInput= searchInput.getText();
String []in;
int counter=0;
String oldData="";
in = getInput.split(" ");
for (String[] data1 : data) {
     String []container= data1[1].split(" ");

     for(int i=0;i<in.length ;i++){
         for (String container1 : container) {
              if (in[i].equals(container1)) {
                  oldData=oldData +"\n"+ data1[0];

              }
         }
     }
}

result.setText(oldData);

1 Ответ

0 голосов
/ 20 марта 2020

Ваш код в порядке. На самом деле все отлично. Проблема в том, где вы устанавливаете текст. Прямо здесь:

result.setText(data1[i]);

Прежде всего, если вы используете i, вы получите массив за пределами исключения. Так что это должно быть так:

result.setText(data1[0]);

Во-вторых, вы устанавливаете текст снова и снова, то есть вы удаляете предыдущий текст. Таким образом, вы видите только последний матч. Чтобы решить эту проблему, я бы использовал StringBuilder, чтобы добавить совпадения вместе, а затем после поиска установить текст. Итак, ваш код становится:

String [][] data={{"Cat","Pet Mammal Cute"},
            {"Burger","Food Snack Hot"},
            {"Chicken","Food Bird Pet"},
            {"Ice Cream","Food Dessert Cold"},
            {"Laptop","Gadget Device Computer"},
};

String getInput= searchInput.getText();;
StringBuilder resultString = new StringBuilder();

for (String[] data1 : data) {
    String [] container = data1[1].split(" ");

    for (String keyword : container)
        if (getInput.equals(keyword)) {
            resultString.append(data1[0]);
            resultString.append(", ");
        }
 }

 result.setText(resultString.toString().substring(0, resultString.length() - 2));

Кстати, resultString.length() - 2 в конце - просто удалить последние бесполезные запятые.

Редактировать: С помощью во-вторых, отредактируйте то, что вы по сути пытаетесь сделать, это связать каждый элемент со свойством: количеством тегов. Вот почему мы будем использовать HashMap<String, Integer> для этого. Это код (если вы ничего не понимаете, спросите меня):

String [][] data={{"Cat","Pet Mammal Cute"},
            {"Burger","Food Snack Hot"},
            {"Chicken","Food Bird Pet"},
            {"Ice Cream","Food Dessert Cold"},
            {"Laptop","Gadget Device Computer"},
};

String getInput = searchInput.getText();
String[] in;

in = getInput.split(" ");

HashMap<String, Integer> tags = new HashMap<>();

for (String[] data1 : data) {
     String[] container = data1[1].split(" ");

     for (String s : in) {
          for (String container1 : container) {
               if (s.equals(container1)) {
                   //Here what we do is pass the number of tags. If it hasn't been detected it returns 0. And 0 + 1 = 1. So in the map you store that you have detected the item once and it continues etc.
                   tags.put(data1[0], tags.getOrDefault(data1[0], 0) + 1);
               }
          }
     }
}

StringBuilder stringBuilder = new StringBuilder();

stringBuilder.append("Items | Number of tags\n");

for (String item : tags.keySet()) {
     stringBuilder.append(item + " | " + tags.get(item) + " Tags Matched\n");
}

//System.out.println(stringBuilder.toString());
//or in your code:
result.setText(stringBuilder.toString());

По сути, мы помещаем элемент с количеством тегов. Каждый раз, когда мы находим элемент, мы увеличиваем количество тегов на единицу с добавлением.

Это то, что он производит, когда мы печатаем:

Items | Number of tags
Cat | 3 Tags Matched
Chicken | 1 Tags Matched

Ваш желаемый результат:)

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