Java 对字符串进行桶排序
我不知道使用桶排序对始终具有相同长度的字符串列表进行排序的最佳方法是什么。
算法如下所示:
For the last character position down to the first:
For each word in the list:
Place the word into the appropriate bucket by current character
For each of the 26 buckets(arraylists)
Copy every word back to the list
我正在用 java 编写,并且使用 arraylist 作为存储未排序字符串的主列表。每个字符串的长度为五个字符。
这就是我开始的。它只是在第二个 for 循环中突然停止,因为我不知道下一步该做什么,也不知道我是否正确地完成了第一部分。
ArrayList<String> count = new ArrayList<String>(26);
for (int i = wordlen; i > 0; i--) {
for (int j = 0; i < myList.size(); i++)
myList.get(j).charAt(i)
}
提前致谢。
编辑:这就是我现在所拥有的。我知道这是行不通的,因为如果有多个字符串以相同的字母开头,那么它就会爆炸,但我认为我的方向更正确。当我运行它时,即使我输入了单词以确保没有重复的字母,它也会在第一组行上崩溃: count.set(myList.get(j).charAt(i), myList.get(j));
它说“线程“main”中出现异常 java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:5”
public void BucketSort(int wordlen) {
ArrayList<String> count = new ArrayList<String>(26);
//Make it so count has a size
for(int p = 0; p < 26; p++)
count.add(null);
for (int i = wordlen; i > 0; i--) { //for each letter
for (int j = 0; j < myList.size(); j++) //for each word
//Add the word to count based on the letter
count.add((int)myList.get(j).charAt(i) - 65, myList.get(j));
}
//Clear the main list so there aren't a bunch of unsorted words leftover
myList.clear();
//Add the words back in to the list based on their order in count
for (int m = 0; m < 26; m++)
myList.add(count.get(m));
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
这对我来说就像是家庭作业,所以我不会用代码解决方案来回应。
但基本上,你所要做的就是设置你的水桶。也许您希望您的存储桶是一个
Map>
——也就是说,您希望将每个字母 A - Z 映射到与该字母匹配的单词列表(例如您当前正在查看的位置)。该单词列表就是您的存储桶。然后,完成内部循环后,从 AZ 开始对地图的内容进行另一个循环(提示:
for ( char ch = 'A'; ch <= 'Z' ; ch++ )
) 并将相应存储桶的内容转储回您的(清空的)列表中。This looks like homework to me, so I won't respond with a code solution.
But basically, the bit you're stuck on is setting up your buckets. Probably you want your buckets to be a
Map<Character, List<String>>
-- that is, you want to map each letter A - Z to a list of words that match that letter (for the position you're currently looking at). That list of words is your bucket.Then, after you finish the inner loop you've got there, you do another loop through the contents of the map, going from A-Z (hint:
for ( char ch = 'A'; ch <= 'Z'; ch++ )
) and dumping the contents of the corresponding bucket back into your (emptied) list.在一个小列表上测试了这个;是的,我也必须这样做作为家庭作业,并且为了您的方便留下评论,这样您就可以了解发生了什么,而不仅仅是复制粘贴它(如果您这样做,您的 OV 分数将是 100%!)。
Tested this on a small list; yes, I also had to do this for homework and for your convenience left comments so you can understand what is going on and not just copy paste it (your OV score will be 100% if you do!).
如果您不打算使用
Map
,则可以使用 @JacobM 但有一个 List 数组。因此,您创建List[] buckets = new List[26]
。If you are not going to use
Map
, you can use the same logic as described by @JacobM but have an array of List instead. So you createList<String>[] buckets = new List<String>[26]
.