LINUX.ORG.RU

Работа с последовательностями в разных языках

 , , , ,


7

9

Навеяно темой Ментальный вирус, пример взят и дополнен оттуда. Интересует реализация подобной операции на других языках. Лично я хотел бы увидеть на Lisp, Java, Smalltalk, Erlang.

array = ["John", "James", "Jakob", "Peter", "Janette", "Tom", "Vasya", "Jean", "Juilia", "Heather"]

puts array.select{|v|v[/^J[a-z]+/]}. # ВЫБРАТЬ ПО someregexp
each_slice(3). # КАЖДЫЙ КУСОК ПО 3 ЭЛЕМЕНТА
map{|v| "#{v[0]} and #{v[1]} follow #{v[2]}"}. # ПОДСТАВИТЬ ЗНАЧЕНИЯ В СТРОКУ
join("\n") # ОБЪЕДИНИТЬ
# John and James follow Jakob
# Janette and Jean follow Juilia

Пошагово для тех, кто не знаком с Ruby:

array.select{|v|v[/^J[a-z]+/]}
# ["John", "James", "Jakob", "Janette", "Jean", "Juilia"]
array.select{|v|v[/^J[a-z]+/]}.
each_slice(3).to_a # в массив
# [["John", "James", "Jakob"], ["Janette", "Jean", "Juilia"]]
array.select{|v|v[/^J[a-z]+/]}.each_slice(3).
map{|v| "#{v[0]} and #{v[1]} follow #{v[2]}"}
# ["John and James follow Jakob", "Janette and Jean follow Juilia"]
array.select{|v|v[/^J[a-z]+/]}.each_slice(3).map{|v| "#{v[0]} and #{v[1]} follow #{v[2]}"}.
join("\n") 
# "John and James follow Jakob\nJanette and Jean follow Juilia"

Использовать только стандартную библиотеку.

Целесообразность операции не важна. Вопрос кратности количества найденных элементов трем не рассматриваем.



Последнее исправление: ymn (всего исправлений: 3)
Ответ на: комментарий от RedPossum

Более аккуратно, без дублирования:

for(final List strs = new ArrayList<String>(){{
		for(String str : asList("John", "James", "Jakob", "Peter", "Janette", "Tom", "Vasya", "Jean", "Juilia", "Heather"))
			if(str.startsWith("J")) add(str);
	}};
	!strs.isEmpty();
	new Callable(){
		@Override
		public Object call() throws Exception {
			System.out.format("%s and %s follows %s \n", copyOfRange(strs.toArray(), 0, 3));
			strs.removeAll(Arrays.asList(copyOfRange(strs.toArray(), 0, 3)));
			return null;
		}
	}.call()
);
DiKeert ★★
()
Ответ на: комментарий от DiKeert

Я думаю вот окончальный вариант однострочника на Java:

for(final List strs = new ArrayList<String>(){{
		for(String str : asList("John", "James", "Jakob", "Peter", "Janette", "Tom", "Vasya", "Jean", "Juilia", "Heather"))
			if(str.startsWith("J")) add(str);
	}};
	!strs.isEmpty();
	new Object(){{
		System.out.format("%s and %s follows %s \n", copyOfRange(strs.toArray(), 0, 3));
		strs.removeAll(Arrays.asList(copyOfRange(strs.toArray(), 0, 3)));
	}}
);
DiKeert ★★
()
Ответ на: комментарий от DiKeert
strs.removeAll(Arrays.asList(copyOfRange(strs.toArray(), 0, 3)));

замени на

strs.subList(0, 3).clear();
иначе при повторении имен у тебя код с ума сойдет. и это если не считать того, что в твоем коде многократно пересоздается массив со строками.

maloi ★★★★★
()
Последнее исправление: maloi (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.