将词汇顺序分数分配给字符串

时间:2017-03-24 10:09:21

标签: java string algorithm sorting unicode

在我目前的项目中,我们有一种奇怪的排序系统。

与通过将元素相互比较来确定元素顺序的通常方法相反,我们首先为每个元素分配一个数字分数,然后按此分数进行排序。这样我们就可以通过改变分数分配部分来按不同的标准进行排序。

我想要的是在字符串上定义一个函数; f(a)< f(b)如果a以词汇顺序出现在b之前,反之亦然。

字符串是unicode,我们应该支持不区分大小写。

这可能吗?

3 个答案:

答案 0 :(得分:4)

不要误会我的意思,但这种做法没有意义。因为这意味着你可以使用Java"默认"解决问题的机制;那就是:你创建自己的自定义Comparator

含义:在对某些类的对象的集合/数组进行排序时,合理的方式来定义它们的排序是通过提供一个比较器来告诉您该类的任何两个对象如何对它们进行排序

嗯,考虑到你的设置,这可能意味着:你的比较器需要能够从提供的输入对象计算得分。然后,它可以使用进一步信息(如字符串值)做出进一步的决定。

再想一想:你真的应该回到这里。如果你有一个巨大的代码库已经在使用这个奇怪的系统;那么,你需要定义一个得分函数,将你的字符串减少为数字;并确保得分值与f(a)< f(b)您正在寻找的关系。但如果你刚刚开始;严肃地说:考虑放弃使用评分功能的想法。而只需使用不同的比较器实现来实现基于不断变化的标准的排序。

答案 1 :(得分:4)

  

我想要的是在字符串上定义一个函数; f(a)< f(b)如果a以词汇顺序出现在b之前,反之亦然。字符串是unicode,我们应该支持不区分大小写。

     

这可能吗?

不,除非你的琴弦长度有限,否则不会。假设f(“a”)= 1.那么,显然,f(“aa”)> = 2.继续这种模式,f(“aa ... a”)> = n代表“aa ... a “包含n个符号。因为对于任何这样的字符串f(“aa ... a”)< f(“b”),f(“b”)必须大于任何n。

请注意,如果你使用BigDecimal作为函数的值而不是整数类型,有一种方法(虽然使用Unicode可能有点棘手,基本的想法是没有规范化字符串并将其转换为字节逐字节成十进制数字。)

答案 2 :(得分:1)

您需要实现自定义Comparator。像这样的东西 -

import java.util.Comparator;

public class myString {
    private String s;   
    private int score;
    // getter & setter
    // ...
}


public class ScoredStringComparator implements Comparator<myString>
{
    @Override
    public int compare(myString x, myString y)
    {
        // Assume neither string is null.
        if (x.getScore() < y.getScore())
        {
            return -1;
        }
        if (x.getScore() > y.getScore())
        {
            return 1;
        }
        return 0;
    }
}

将字符串放入s TreeSet。

TreeSet<myString> stringSet = new TreeSet<myString>(new ScoredStringComparator());

现在,当您需要更新字符串的分数时,您可以以对数时间复杂度来完成。

stringSet.remove(aString);
aString.setScore(newScore);
stringSet.add(aString);