Вот метод, который дает вам все комбинации заданного размера из строки случайной длины. Подобно решению quinmars, но работает для разнообразного ввода и k.
Код можно изменить для обертывания, т. Е. 'Dab' из ввода 'abcd' wk = 3.
public void run(String data, int howMany){
choose(data, howMany, new StringBuffer(), 0);
}
//n choose k
private void choose(String data, int k, StringBuffer result, int startIndex){
if (result.length()==k){
System.out.println(result.toString());
return;
}
for (int i=startIndex; i<data.length(); i++){
result.append(data.charAt(i));
choose(data,k,result, i+1);
result.setLength(result.length()-1);
}
}
Выход для «abcde»:
abc abd abe acd ace ade bcd bce bde cde
blockquote>
Я пытался писать библиотеку GUI в Ruby с небольшим C и прежде всего Ruby. Это закончило тем, что было так медленно, я сдался и никогда не выпускал его. Но я записал систему событий для него, что я пытался сделать легче, чем C#. Я переписал его пару раз, чтобы помочь использовать. Я надеюсь, что это несколько полезно.
class EventHandlerArray < Array
def add_handler(code=nil, &block)
if(code)
push(code)
else
push(block)
end
end
def add
raise "error"
end
def remove_handler(code)
delete(code)
end
def fire(e)
reverse_each { |handler| handler.call(e) }
end
end
# with this, you can do:
# event.add_handler
# event.remove_handler
# event.fire (usually never used)
# fire_event
# when_event
# You just need to call the events method and call super to initialize the events:
# class MyControl
# events :mouse_down, :mouse_up,
# :mouse_enter, :mouse_leave
# def initialize
# super
# end
# def when_mouse_up(e)
# # do something
# end
# end
# control = MyControl.new
# control.mouse_down.add_handler {
# puts "Mouse down"
# }
# As you can see, you can redefine when_event in a class to handle the event.
# The handlers are called first, and then the when_event method if a handler didn't
# set e.handled to true. If you need when_event to be called before the handlers,
# override fire_event and call when_event before event.fire. This is what painting
# does, for handlers should paint after the control.
# class SubControl < MyControl
# def when_mouse_down(e)
# super
# # do something
# end
# end
def events(*symbols)
# NOTE: Module#method_added
# create a module and 'include' it
modName = name+"Events"
initStr = Array.new
readerStr = Array.new
methodsStr = Array.new
symbols.each { |sym|
name = sym.to_s
initStr << %Q{
@#{name} = EventHandlerArray.new
}
readerStr << ":#{name}"
methodsStr << %Q{
def fire_#{name}(e)
@#{name}.fire(e)
when_#{name}(e) if(!e.handled?)
end
def when_#{name}(e)
end
}
}
eval %Q{
module #{modName}
def initialize(*args)
begin
super(*args)
rescue NoMethodError; end
#{initStr.join}
end
#{"attr_reader "+readerStr.join(', ')}
#{methodsStr.join}
end
include #{modName}
}
end
class Event
attr_writer :handled
def initialize(sender)
@sender = @sender
@handled = false
end
def handled?; @handled; end
end
Я не уверен в точно, что Вы имеете в виду, но Вы могли, вероятно, использовать исключения в своих классах и повысить их на определенных "событиях". При необходимости в событии для разработки GUI тогда, большинство платформ GUI определяет свой собственный стиль обработки событий.
Hope это несколько отвечает, что Вы - вопрос.
На вопрос уже ответили, но существует , наблюдатель встроил прямо в стандартную библиотеку, если Вы хотите посмотреть на это. Я использовал его в прошлом для маленького игрового проекта, и это работает очень хорошо.