我需要实现一个gnomesort来对字符串与字符串输入的接近程度进行排序。我用Levenshtein算法来衡量这种差异。
算法工作正常,但前提是我在数据库中有两个字符串。然后对它进行很好的排序,但是如果有两个以上的字符串,它只会按照它们在数据库中的顺序打印它们。我真的找不到问题
public static void retrieveFromDatabase(String string)
{
String[] sq = new String[database.size()];
database.toArray(sq);
int r = 0, index = 1, y = 2, tmp1 = 0;
String tmp2;
int[] ds = new int[sq.length];
for (int i = 0; i < database.size(); i++) {
ds[i] = sortLevenshtein(string, database.get(i), false);
}
for(index = 1; index < ds.length; index++) // gnomsort
{
if(ds[index - 1] <= ds[index] )
{
++index;
}
else
{
tmp1 = ds[index];
tmp2 = sq[index];
ds[index] = ds[index - 1];
sq[index] = sq[index - 1];
ds[index-1] = tmp1;
sq[index-1] = tmp2;
index--;
if (index == 0)
index++;
}
}
System.out.println("Best matches: ");
for(r=0; r<Math.min(3,sq.length); r++)
{
System.out.println(ds[r] + "\t" + sq[r]);
}
}
答案 0 :(得分:0)
要排序的元素超过两个时,您的gnome排序不正确。
在有问题的情况下,您的ds
从一开始就包含1、1、0。在for
循环中,index
为1。您看到索引0和1处的元素的顺序正确(两个元素均为1),因此在index
中将if
递增到2 for
语句。接下来,您的index
循环也会递增ds.length
,因此现在是3。3不小于for
(也是3),因此循环终止。
我不知道gnome的排序,因此无法告诉您解决方法。我能告诉您的是,在index
循环内操作for
循环控制变量— for(index = 1; index < ds.length; index++) // OK: loop control variable is incremented here
{
if(ds[index - 1] <= ds[index] )
{
++index; // No-no: incrementing loop control variable, dangerous
}
else
{
tmp1 = ds[index];
tmp2 = sq[index];
ds[index] = ds[index - 1];
sq[index] = sq[index - 1];
ds[index-1] = tmp1;
sq[index-1] = tmp2;
index--; // No-no: decrementing loop control variable, problematic
if (index == 0)
index++; // No-no: incrementing loop control variable
}
}
是在代码中 public class Message
{
private System.Drawing.Image image;
private string stringMember;
private string nullMember;
public Message(System.Drawing.Image i, string str1, string str2)
{
image = i;
stringMember = str1;
nullMember = str2;
}
public System.Drawing.Image MonImage
{
get { return image; }
}
public string StringMember
{
get { return stringMember; }
}
public string NullMember
{
get { return nullMember; }
}
}
的肯定方式,这种方式很难理解而且很难发现错误。我从来没有这样做。
System.Drawing.Image myImage = WpfApp3.Properties.Resources.stan;
List<Message> items = new List<Message>();
items.Add(new Message(myImage, "Test", null));
DataGrid.ItemsSource = items;