Для строк без пробела мы можем использовать приведенный ниже код
private static void findRecurrence(String input) {
final Map<String, Integer> map = new LinkedHashMap<>();
for(int i=0; i<input.length(); ) {
int pointer = i;
int startPointer = i;
boolean pointerHasIncreased = false;
for(int j=0; j<startPointer; j++){
if(pointer<input.length() && input.charAt(j)==input.charAt(pointer) && input.charAt(j)!=32){
pointer++;
pointerHasIncreased = true;
}else{
if(pointerHasIncreased){
break;
}
}
}
if(pointer - startPointer >= 2) {
String word = input.substring(startPointer, pointer);
if(map.containsKey(word)){
map.put(word, map.get(word)+1);
}else{
map.put(word, 1);
}
i=pointer;
}else{
i++;
}
}
for(Map.Entry<String, Integer> entry : map.entrySet()){
System.out.println(entry.getKey() + " = " + (entry.getValue()+1));
}
}
. Передача некоторого ввода как «hahaha» или «ba na na» или «xxxyyyzzzxxxzzz» дает желаемый результат.
я нашел некоторые проблемы с точечным разделителем в предыдущей вершине проголосовавшими ответами. Я разработал универсальное решение, где можно использовать то, что Вы хотите как тысяча разделителей, не изменяя локаль . Я знаю, что это не самое изящное решение, но это сделало задание. Не стесняйтесь улучшать его!
def format_integer(number, thousand_separator='.'):
def reverse(string):
string = "".join(reversed(string))
return string
s = reverse(str(number))
count = 0
result = ''
for char in s:
count = count + 1
if count % 3 == 0:
if len(s) == count:
result = char + result
else:
result = thousand_separator + char + result
else:
result = char + result
return result
print(format_integer(50))
# 50
print(format_integer(500))
# 500
print(format_integer(50000))
# 50.000
print(format_integer(50000000))
# 50.000.000
Просто подкласс long
(или float
, или что-то еще). Это очень практично, потому что таким образом вы все еще можете использовать свои числа в математических операциях (и, следовательно, существующий код), но все они будут хорошо печататься в вашем терминале.
>>> class number(long):
def __init__(self, value):
self = value
def __repr__(self):
s = str(self)
l = [x for x in s if x in '1234567890']
for x in reversed(range(len(s)-1)[::3]):
l.insert(-x, ',')
l = ''.join(l[1:])
return ('-'+l if self < 0 else l)
>>> number(-100000)
-100,000
>>> number(-100)
-100
>>> number(-12345)
-12,345
>>> number(928374)
928,374
>>> 345
Я уверен, что для этого должна быть стандартная библиотечная функция, но было интересно попробовать чтобы написать это сам, используя рекурсию, так вот
Вот код группировки локали после удаления ненужных частей и небольшой очистки:
(Следующее работает только для целых чисел)
def group(number):
s = '%d' % number
groups = []
while s and s[-1].isdigit():
groups.append(s[-3:])
s = s[:-3]
return s + ','.join(reversed(groups))
>>> group(-23432432434.34)
'-23,432,432,434'
Здесь уже есть несколько хороших ответов. Я просто хочу добавить это на будущее. В python 2.7 будет спецификатор формата для разделителя тысяч. Согласно документам python это работает так
>>> '{:20,.2f}'.format(f)
'18,446,744,073,709,551,616.00'
В python3.1 вы можете сделать то же самое, например:
>>> format(1234567, ',d')
'1,234,567'
Вот это работает:
>>> import locale
>>> locale.setlocale(locale.LC_ALL, 'en_US')
'en_US'
>>> locale.format("%d", 1255000, grouping=True)
'1,255,000'
Конечно, вам не нужна поддержка интернационализации, но она ясна, лаконична и использует встроенную библиотеку.
PS Этот "% d" является обычным средством форматирования в стиле%. У вас может быть только один форматтер, но он может быть любым, что вам нужно с точки зрения ширины поля и настроек точности.
PPS Если вы не можете заставить работать локаль
, я бы предложил модифицированную версию ответа Марка:
def intWithCommas(x):
if type(x) not in [type(0), type(0L)]:
raise TypeError("Parameter must be an integer.")
if x < 0:
return '-' + intWithCommas(-x)
result = ''
while x >= 1000:
x, r = divmod(x, 1000)
result = ",%03d%s" % (r, result)
return "%d%s" % (x, result)
Рекурсия полезна для отрицательного случая, но одна рекурсия на запятую кажется мне немного чрезмерной.