基于标记搜索项目的Java程序

基于标记搜索项目的Java程序,java,arrays,search,tags,Java,Arrays,Search,Tags,我想做一个程序,搜索基于标签的项目。我使用一个2D数组来放置项目及其相应的标记 ---------------------------- Item1 | Tags Cat | Pet Cute Mammal Burger | Food Snack Mammal Chicken | Animal Food Pet -----------------

我想做一个程序,搜索基于标签的项目。我使用一个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);

字符串[][]数据={{“猫”,“宠物哺乳动物可爱”},
{“汉堡”,“热快餐”},
{“鸡”,“食鸟宠物”},
{“冰激凌”、“冷食甜点”},
{“笔记本电脑”、“小工具设备计算机”},
};
字符串getInput=searchInput.getText();
中的字符串[];
int计数器=0;
字符串oldData=“”;
in=getInput.split(“”);
for(字符串[]数据1:数据){
字符串[]容器=data1[1]。拆分(“”);

对于(int i=0;i来说,您的代码很好。它实际上做得很好。问题在于您在哪里设置文本。就在这里:

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
来进行编辑。这就是代码(如果您不了解任何内容,请问我):


您想要的结果:)

您的代码很好。它实际上做得很好。问题是您在哪里设置文本。就在这里:

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
来进行编辑。这就是代码(如果您不了解任何内容,请问我):


你想要的结果:)

它正在工作!非常感谢!顺便说一句,我只是想知道是否有不使用hasmap的手动方式来完成。这将是一个很大的帮助!你可以使用2D数组手动完成它,就像你对数据所做的那样。通过将项目和标记放入2D数组中,它会工作,代码不会像w一样干净使用Hashmap。希望有帮助:)它正在工作!非常感谢!顺便说一句,我只是想知道是否有不使用hasmap的手动方法可以做到这一点。这将是一个很大的帮助!您可以使用2D数组手动完成它,就像您对数据所做的那样。通过将项目和标记放入2D数组中,它会工作,代码不会像现在这样干净使用Hashmap。希望有帮助:)