Усеките строку, не заканчиваясь посреди слова

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

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

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
42
задан Jack 8 July 2013 в 20:34
поделиться

5 ответов

Я на самом деле записал решение для этого на недавнем моем проекте. Я сжал большинство его вниз, чтобы быть немного меньшим.

def smart_truncate(content, length=100, suffix='...'):
    if len(content) <= length:
        return content
    else:
        return ' '.join(content[:length+1].split(' ')[0:-1]) + suffix

то, Что происходит, является проверками оператора "if", если Ваше содержание уже является меньше, чем предел. Если это не, это усекает к желаемой длине, разделениям на пространстве, удаляет последний элемент (так, чтобы Вы не отключали слово), и затем присоединяется к нему назад вместе (при прикреплении на '...').

61
ответ дан Adam 26 November 2019 в 23:20
поделиться

Вот немного лучшая версия последней строки в решении Adam:

return content[:length].rsplit(' ', 1)[0]+suffix

(Это немного более эффективно, и возвращает более разумный результат в случае, нет никаких пробелов перед строкой.)

45
ответ дан bobince 26 November 2019 в 23:20
поделиться

Существует несколько тонкости, которая может или не может быть проблемами для Вас, такими как обработка вкладок (Например, если Вы отображаете их как 8 пробелов, но рассматриваете их как 1 символ внутренне), обрабатывая различные ароматы повреждения и неразрывного пробела или разрешения повреждения на расстановке переносов и т.д., Если какое-либо из этого желательно, можно хотеть смотреть на модуль переноса текста. например:

def truncate(text, max_size):
    if len(text) <= max_size:
        return text
    return textwrap.wrap(text, max_size-3)[0] + "..."

поведение по умолчанию для слов, больше, чем max_size, состоит в том, чтобы повредить их (делающий max_size жесткий предел). Можно измениться на мягкий предел, используемый некоторыми из других решений здесь путем передачи break_long_words=False для обертывания (), в этом случае он возвратит целое слово. Если Вы хотите это изменение поведения последняя строка к:

    lines = textwrap.wrap(text, max_size-3, break_long_words=False)
    return lines[0] + ("..." if len(lines)>1 else "")

существует несколько других опций как expand_tabs, который может представлять интерес в зависимости от точного поведения, которое Вы хотите.

11
ответ дан Brian 26 November 2019 в 23:20
поделиться
def smart_truncate1(text, max_length=100, suffix='...'):
    """Returns a string of at most `max_length` characters, cutting
    only at word-boundaries. If the string was truncated, `suffix`
    will be appended.
    """

    if len(text) > max_length:
        pattern = r'^(.{0,%d}\S)\s.*' % (max_length-len(suffix)-1)
        return re.sub(pattern, r'\1' + suffix, text)
    else:
        return text

ИЛИ

def smart_truncate2(text, min_length=100, suffix='...'):
    """If the `text` is more than `min_length` characters long,
    it will be cut at the next word-boundary and `suffix`will
    be appended.
    """

    pattern = r'^(.{%d,}?\S)\s.*' % (min_length-1)
    return re.sub(pattern, r'\1' + suffix, text)

ИЛИ

def smart_truncate3(text, length=100, suffix='...'):
    """Truncates `text`, on a word boundary, as close to
    the target length it can come.
    """

    slen = len(suffix)
    pattern = r'^(.{0,%d}\S)\s+\S+' % (length-slen-1)
    if len(text) > length:
        match = re.match(pattern, text)
        if match:
            length0 = match.end(0)
            length1 = match.end(1)
            if abs(length0+slen-length) < abs(length1+slen-length):
                return match.group(0) + suffix
            else:
                return match.group(1) + suffix
    return text
7
ответ дан Markus Jarderot 26 November 2019 в 23:20
поделиться
def smart_truncate(s, width):
    if s[width].isspace():
        return s[0:width];
    else:
        return s[0:width].rsplit(None, 1)[0]

Тестирование его:

>>> smart_truncate('The quick brown fox jumped over the lazy dog.', 23) + "..."
'The quick brown fox...'
3
ответ дан Vebjorn Ljosa 26 November 2019 в 23:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: