2017-02-14 7 views
0

Есть ли способ оставить пространство, где это необходимо при вызове метода getClass().getSimpleName().toLowerCase()?Оставляя пробел, когда это необходимо при вызове getClass(). GetSimpleName()

Например, у меня есть несколько различных классов, имена которых PublicTransportation, CityBus, Metro, Tram, Ferry, Aircraft.

Я определил свои методы toString(), но хотел бы оставить пробел между Public и Transportation. То же самое для класса CityBus. Вот мои toString() методы:

//PublicTransportation class 
public String toString() 
{ 
    return "This " + getClass().getSimpleName().toLowerCase() + " costs " + getTicketPrice() + ". It has " + getNumOfStops() + " number of stops."; 
} 

//CityBus class 
public String toString() 
{ 
    return super.toString() + " It's route number is " + getRouteNum() 
      + ".\nIt's operation start year is " + getBeginOpYear() + ". The line name is " + getLineName() + ". The driver is " 
      + getDriverName() + "."; 
} 
+0

Я думаю, что ваш вопрос непонятен. Вы можете объяснить несколько примеров? –

+0

'getSimpleName' никак не связано с' toString': 'toString' - метод, который может возвращать разные результаты для разных экземпляров, а' getSimpleName' - метод класса! – alfasin

+1

Вы можете сохранить 'getClass(). GetSimpleName(). ToLowerCase()' привести к переменной, а затем добавить пространство по мере необходимости. – Lopan

ответ

3

Одним из способов сделать это было бы регулярное выражение. Например, System.out.println("CityBus".replaceAll("([a-z])([A-Z])", "$1 $2")) распечатает City Bus (с пробелом). Так что в вашем случае, toString() будет что-то вроде этого:

public String toString() 
{ 
    String expandedName = getClass().getSimpleName().replaceAll("([a-z])([A-Z])", "$1 $2"); 
    return "This " + expandedName + " costs " + getTicketPrice() + ". It has " + getNumOfStops() + " number of stops."; 
} 

Это можно сделать немного лучше, делая expandedName строку static поэтому мы не делаем замены регулярных выражений на каждом вызове toString(), но только один раз за класс.

Edit:

replaceAll() занимает два regular expressions, и заменяет одно с другим. Регулярное выражение заменяется на ([a-z])([A-Z]), что переводится как «строчная буква, за которой следует буква верхнего регистра», в скобках указаны обе буквы, что делает их capture groups. Затем я заменю его на $1 $2, что означает «группа захвата 1, пространство, группа захвата 2».

+0

Это работает лучше всего! Не могли бы вы объяснить, какие параметры передаются в методе replaceAll()? – JKawa

+0

@JKawa Я добавил объяснение в ответ. – Malt

+0

Это отлично! Большое спасибо, спасибо! – JKawa

1

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

Если возможно, вы можете попробовать определить свой собственный метод getSimpleName (или методы) возвращает имя класса в желаемом формате.

0

Вы можете разделить имя класса по ГорбатыйРегистр с помощью регулярных выражений с:

getClass().getSimpleName().split("(?<=[a-z])(?=[A-Z])")

Затем с помощью StringBuffer построить конечную строку из результирующего массива.