Java 算法似乎只对ArrayList的最后一块有效

Java 算法似乎只对ArrayList的最后一块有效,java,algorithm,arraylist,Java,Algorithm,Arraylist,该算法的目标是获取字符串列表,并对其进行缩写,使其能够唯一地识别所代表的单词,这是一项家庭作业。我尝试为该问题创建的算法会搜索子字符串以查找任何可能的匹配项,虽然trie似乎对这个解决方案更有效,但我似乎无法理解一个trie的代码是如何工作的;也就是说,这样做还是很有可能的。 输入:~~~~~~~~~~~~预期输出:~~~~~~~~~~~~~~实际输出: 碳水化合物---------碳水化合物------------------------------碳水化合物 购物车-------------

该算法的目标是获取字符串列表,并对其进行缩写,使其能够唯一地识别所代表的单词,这是一项家庭作业。

我尝试为该问题创建的算法会搜索子字符串以查找任何可能的匹配项,虽然trie似乎对这个解决方案更有效,但我似乎无法理解一个trie的代码是如何工作的;也就是说,这样做还是很有可能的。

输入:~~~~~~~~~~~~预期输出:~~~~~~~~~~~~~~实际输出:
碳水化合物---------碳水化合物------------------------------碳水化合物
购物车--------------------购物车--------------------购物车
化油器----------卡布--------------------化油器
焦糖--------------------焦糖--------------------焦糖
驯鹿--------------------驯鹿--------------------驯鹿
碳--------------------碳--------------------碳
软骨------------------软骨----------------------------软骨
碳------------------碳------------------碳
运输------------------运输------------------卡尔
纸箱--------------------纸箱--------------------纸箱
汽车--------------------汽车--------------------汽车
碳酸盐----------碳--------------------碳

这是实际的代码。

import java.util.ArrayList;
公共类最短前缀
{
ArrayList characterCounter=新的ArrayList();
布尔相等=假;
公共静态ArrayList testArrayList()
{
ArrayList testArray=新的ArrayList();
添加(“碳水化合物”);
testArray.添加(“购物车”);
添加(“化油器”);
添加(“焦糖”);
添加(“驯鹿”);
添加(“碳”);
添加(“软骨”);
添加(“碳”);
添加(“运输”);
添加(“纸箱”);
添加(“汽车”);
添加(“碳酸盐”);
返回测试阵列;
}
公共ArrayList getShortestPrefixes(ArrayList输入)
{
ArrayList输出=新的ArrayList();
System.out.println(input.size());

对于(int count=0;count如果我很理解您要做的事情,那么对于每个单词,您都会尝试找到最短的前缀,从最长的前缀开始

然后检查下一个前缀(当前前缀减去一个字符)是否等于其他单词的所有可能的子字符串中的一些。 请注意,您还将前缀与当前单词子字符串进行比较,在此比较中需要跳过当前单词

如果下一个前缀是唯一的,则它将成为当前前缀:
word.substring(0,word.length()-1)
应重复此过程,直到找不到唯一的较短前缀为止

但这对于
来说非常奇怪:

for (int searchCount = 0; searchCount < input.get(searchCount).length(); searchCount++)
提示每次迭代的输出为:

Iteration 0: [, , , , , , , , , , , ]
Iteration 1: [c, c, c, c, c, c, c, c, c, c, c, c]
Iteration 2: [ca, ca, ca, ca, ca, ca, ca, ca, ca, ca, ca, ca]
Iteration 3: [car, car, car, car, car, car, car, car, car, car, car, car]
Iteration 4: [carb, cart, carb, cara, cari, carb, cart, carb, carr, cart, car, carb]
Iteration 5: [carbo, cart, carbu, cara, cari, carbo, carti, carbo, carr, carto, car, carbo]
Iteration 6: [carboh, cart, carbu, cara, cari, carbon, carti, carbon, carr, carto, car, carbon]
Iteration 7: [carboh, cart, carbu, cara, cari, carboni, carti, carbon, carr, carto, car, carbona]
试试看。我用一个小的实现对它进行了测试。但由于这是我的家庭作业,我认为我不应该直接给你代码;)如果你卡住了,发表评论

伪代码

// Step 0: Initialize input and output

input <- [carbohydrate, cart, carburetor, caramel, caribou, carbonic, cartilage, carbon, carriage, carton, car, carbonate]
output <- [ , , , , , , , , , , , ]

allFound <- false; // Helper variable to know if all prefixes are valid

while (not allFound) { // Step 2 Iteration: until all prefixes are ok

    // For simplicity, we first count the occurrences of each prefix
    for each prefix in output {
        prefixCount[prefix] <- prefixCount[prefix] + 1 // You may use a Map for this 
    }

    // Step 1: For each prefix check if is valid, if not add one more char
    allFound <- true; 
    for (i = 0; i < output size; i++) {
        if not (prefixCount[prefix] == 1 /* is unique */ OR output[i] is equals input[i]) {
            // Prefix is not ok                
            output[i] <- output[i] + next char form input[i]; // Add one more char
            allFound <- false; // Step 2 iteration condition "some prefix is not valid"
        }       
    }   
}   
//步骤0:初始化输入和输出

输入
if(input.get(compare).equals(word)){}
的目的是什么?您如何获得这个映射
carbohy------------------------------------------carbohy--------------------------------carbohy
您期望的carboh不在输入中的位置?if(input.get(compare).equals(word){是我用来通过强制循环继续来调试代码的东西();但我在某个时候删除了它,这让它成为了垃圾。感谢您的快速回复和帮助,这正是我试图做的。我在尝试您的方法时遇到了一个问题,我真的不确定如何利用我的循环来达到所需的结果。我有一个for循环,用于循环输入arraylist中的每个字符串,以及通过单个字符串循环的while循环。我只是不确定我应该做什么。@Thraktor编辑了我的答案。我已经简化了算法(当然可以优化)并添加了一个带有主要思想的伪代码。您只需要两个循环级别。我遇到了另一个问题,我认为我从伪代码中为每个循环编写的代码不起作用,我得到了两种情况:要么数组prefixCount的大小重复增加,要么每个值都设置为一,这取决于我在哪里声明它。我写道将其作为常规for循环,因为我不确定for each循环的语法;这是一个问题吗?for each循环本质上等同于常规for。这不是问题。请查看此实现感谢帮助,我之前的问题是我误解了“计算每个前缀的出现次数”的含义在伪代码中。
Iteration 0: [, , , , , , , , , , , ]
Iteration 1: [c, c, c, c, c, c, c, c, c, c, c, c]
Iteration 2: [ca, ca, ca, ca, ca, ca, ca, ca, ca, ca, ca, ca]
Iteration 3: [car, car, car, car, car, car, car, car, car, car, car, car]
Iteration 4: [carb, cart, carb, cara, cari, carb, cart, carb, carr, cart, car, carb]
Iteration 5: [carbo, cart, carbu, cara, cari, carbo, carti, carbo, carr, carto, car, carbo]
Iteration 6: [carboh, cart, carbu, cara, cari, carbon, carti, carbon, carr, carto, car, carbon]
Iteration 7: [carboh, cart, carbu, cara, cari, carboni, carti, carbon, carr, carto, car, carbona]
// Step 0: Initialize input and output

input <- [carbohydrate, cart, carburetor, caramel, caribou, carbonic, cartilage, carbon, carriage, carton, car, carbonate]
output <- [ , , , , , , , , , , , ]

allFound <- false; // Helper variable to know if all prefixes are valid

while (not allFound) { // Step 2 Iteration: until all prefixes are ok

    // For simplicity, we first count the occurrences of each prefix
    for each prefix in output {
        prefixCount[prefix] <- prefixCount[prefix] + 1 // You may use a Map for this 
    }

    // Step 1: For each prefix check if is valid, if not add one more char
    allFound <- true; 
    for (i = 0; i < output size; i++) {
        if not (prefixCount[prefix] == 1 /* is unique */ OR output[i] is equals input[i]) {
            // Prefix is not ok                
            output[i] <- output[i] + next char form input[i]; // Add one more char
            allFound <- false; // Step 2 iteration condition "some prefix is not valid"
        }       
    }   
}