Получить следующую строку в соответствии с ее естественным порядком - PullRequest
3 голосов
/ 26 августа 2010

В Java класс String реализует Comparable, что означает полное упорядочение объектов String. Этот порядок называется естественным порядком класса , а метод класса compareTo называется его естественным методом сравнения. Набор объектов String также исчисляется в математическом смысле.

Мне нужна функция, которая принимает строку и возвращает следующую в соответствии с естественным порядком строки.

Для математически наклонных

function(X) = Y, where Y is such that: 1) X < Y
                                       2) for all Z, if X < Z, then Y <= Z.

Можете ли вы вспомнить функцию, которая делает это для строк? (Соответствующие ^[A-Za-z0-9]+$. Мне все равно, но вы можете избежать управляющих символов или чего-либо, что может вызвать головную боль при кодировании, недопустимо в XML, имеет разрывы строк или подобные «проблемные» символы.)

Ответы [ 3 ]

3 голосов
/ 26 августа 2010
String successor(String s) {
    return s + '\0';
}

Или с вашим ограниченным алфавитом:

String successor(String s) {
    return s + '0';
}

, поскольку '0' имеет наименьшее значение Юникода из всех допустимых символов.

Зачем вам это нужно, кто-то догадывается, хотя ... возможно, есть менее хакерское решение.

1 голос
/ 01 сентября 2010

Как указано в другом ответе, преемником строки является та строка, за которой сразу следует char со значением 0 (в Java char представляет собой интеграл без знака значение, [0,65535] ( §4.2.1 )).

// returns the lexicographical successor of a string
public static String successor(String s) {
    return s + "\0";
}

Следующая выдержка из документации SortedSet предписывает эту точную идиому для Stringи дает мотивацию ПОЧЕМУ вы хотите использовать метод-преемник, подобный этому:

Примечание: несколько методов возвращают подмножества с ограниченными диапазонами.Такие диапазоны являются полуоткрытыми , то есть они включают в себя их низкую конечную точку, но не их высокую конечную точку (где применимо).Если вам нужен закрытый диапазон (который включает в себя обе конечные точки), и тип элемента позволяет вычислить преемника данного значения, просто запросите поддиапазон от lowEndpoint до successor(highEndpoint).Например, предположим, что s - это отсортированный набор строк.Следующая идиома получает представление, содержащее все строки в s от low до high включительно:

SortedSet<String> sub = s.subSet(low, high+"\0");

Аналогичная методика может использоваться для генерации открытого диапазона (который не содержит ни одной конечной точки).Следующая идиома получает представление, содержащее все строки в s от low до high, исключительные:

SortedSet<String> sub = s.subSet(low+"\0", high);

Обратите внимание, что этот идиом все еще неудобно использовать, ине всегда может быть легко вычислить преемник для любого общего типа (например, если это просто SortedSet<Number>).Гораздо более усовершенствованный API - это NavigableSet<E>, который extends SortedSet<E> определяет эти операции диапазона, чтобы разрешить любую комбинацию конечных точек открытия или закрытия с использованием boolean флагов.

Связанные вопросы

0 голосов
/ 26 августа 2010

Не уверен, зачем тебе нужно что-то подобное ... что-то грубое? в любом случае вот очень примитивное решение:


public static String getNextString(String input)
{
  if(input == null || input.trim().length() < 1)
  {
    return("0");
  }
  else
  {
    String trimmed = input.trim();
    int lastPos = input.length()-1;
    int last = (int) input.charAt(lastPos);
    last++;
    if(last > (int) 'z')
    {
      if(lastPos == 0)
      {
        return "00";
      }
      else
      {
        return getNextString(trimmed.substring(0,lastPos-1)) + "0";
      }
    }

  }
}

Очевидно, что могут быть ошибки, потому что я просто набрал это с моего мобильного телефона по дороге домой ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...