/* package whatever; // don't place package name! */
import java.util.ArrayList ;
import java.util.Arrays ;
import java.util.List ;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
public static void main
( String [ ] args
) { List
< StringListPair
> mappings
= Arrays .
asList ( new StringListPair
( "{url}" ,
Arrays .
asList ( "point1" ,
"point2" ) ) ,
new StringListPair
( "{live}" ,
Arrays .
asList ( "10" ,
"20" ,
"30" ) ) ) ; String base
= "I have sample {url} with time to {live}" ; System .
out .
println ( "Recursive:" ) ; for ( String combination
: userecursive
( mappings,base
) ) System .
out .
println ( combination
) ; System .
out .
println ( "Direct:" ) ; for ( String combination
: usedirect
( mappings,base
) ) System .
out .
println ( combination
) ; }
static List
< String
> userecursive
( List
< StringListPair
> mappings,
String base
) { List< String> result= new ArrayList<> ( ) ;
recursive( result, mappings, base, 0 ) ;
return result;
}
static void recursive
( List
< String
> result,List
< StringListPair
> mappings,
String sofar,
int partindex
) { if ( partindex>= mappings.size ( ) ) {
result.add ( sofar) ;
return ;
}
StringListPair p= mappings.get ( partindex) ;
recursive( result,mappings,sofar.replace ( p.s ,item) ,partindex+ 1 ) ;
}
static List
< String
> usedirect
( List
< StringListPair
> mappings,
String base
) { int total= 1 ;
for ( StringListPair p: mappings)
total*= p.l .size ( ) ;
List< String> result= new ArrayList<> ( ) ;
for ( int i= 0 ; i< total; i++ )
result.add ( direct( mappings,base,i) ) ;
return result;
}
static String direct
( List
< StringListPair
> mappings,
String base,
int index
) { for ( StringListPair p: mappings) {
base= base.replace ( p.s ,p.l .get ( index % p.l .size ( ) ) ) ;
index/= p.l .size ( ) ;
}
return base;
}
static class StringListPair{
final List< String> l;
StringListPair
( String s,List
< String
> l
) { this .s = s;
this .l = l;
}
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwppbXBvcnQgamF2YS51dGlsLkxpc3Q7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKCQlMaXN0PFN0cmluZ0xpc3RQYWlyPiBtYXBwaW5ncz1BcnJheXMuYXNMaXN0KAoJCQkJbmV3IFN0cmluZ0xpc3RQYWlyKCJ7dXJsfSIsQXJyYXlzLmFzTGlzdCgicG9pbnQxIiwicG9pbnQyIikpLAoJCQkJbmV3IFN0cmluZ0xpc3RQYWlyKCJ7bGl2ZX0iLEFycmF5cy5hc0xpc3QoIjEwIiwiMjAiLCIzMCIpKSk7CgkJU3RyaW5nIGJhc2U9IkkgaGF2ZSBzYW1wbGUge3VybH0gd2l0aCB0aW1lIHRvIHtsaXZlfSI7CgkJU3lzdGVtLm91dC5wcmludGxuKCJSZWN1cnNpdmU6Iik7CgkJZm9yKFN0cmluZyBjb21iaW5hdGlvbjp1c2VyZWN1cnNpdmUobWFwcGluZ3MsYmFzZSkpCgkJCVN5c3RlbS5vdXQucHJpbnRsbihjb21iaW5hdGlvbik7CgkJU3lzdGVtLm91dC5wcmludGxuKCJEaXJlY3Q6Iik7CgkJZm9yKFN0cmluZyBjb21iaW5hdGlvbjp1c2VkaXJlY3QobWFwcGluZ3MsYmFzZSkpCgkJCVN5c3RlbS5vdXQucHJpbnRsbihjb21iaW5hdGlvbik7Cgl9CgkKCXN0YXRpYyBMaXN0PFN0cmluZz4gdXNlcmVjdXJzaXZlKExpc3Q8U3RyaW5nTGlzdFBhaXI+IG1hcHBpbmdzLFN0cmluZyBiYXNlKXsKCQlMaXN0PFN0cmluZz4gcmVzdWx0PW5ldyBBcnJheUxpc3Q8PigpOwoJCXJlY3Vyc2l2ZShyZXN1bHQsIG1hcHBpbmdzLCBiYXNlLCAwKTsKCQlyZXR1cm4gcmVzdWx0OwoJfQoJc3RhdGljIHZvaWQgcmVjdXJzaXZlKExpc3Q8U3RyaW5nPiByZXN1bHQsTGlzdDxTdHJpbmdMaXN0UGFpcj4gbWFwcGluZ3MsU3RyaW5nIHNvZmFyLGludCBwYXJ0aW5kZXgpIHsKCQlpZihwYXJ0aW5kZXg+PW1hcHBpbmdzLnNpemUoKSkgewoJCQlyZXN1bHQuYWRkKHNvZmFyKTsKCQkJcmV0dXJuOwoJCX0KCQlTdHJpbmdMaXN0UGFpciBwPW1hcHBpbmdzLmdldChwYXJ0aW5kZXgpOwoJCWZvcihTdHJpbmcgaXRlbTpwLmwpCgkJCXJlY3Vyc2l2ZShyZXN1bHQsbWFwcGluZ3Msc29mYXIucmVwbGFjZShwLnMsaXRlbSkscGFydGluZGV4KzEpOwoJfQoJCglzdGF0aWMgTGlzdDxTdHJpbmc+IHVzZWRpcmVjdChMaXN0PFN0cmluZ0xpc3RQYWlyPiBtYXBwaW5ncyxTdHJpbmcgYmFzZSl7CgkJaW50IHRvdGFsPTE7CgkJZm9yKFN0cmluZ0xpc3RQYWlyIHA6bWFwcGluZ3MpCgkJCXRvdGFsKj1wLmwuc2l6ZSgpOwoJCUxpc3Q8U3RyaW5nPiByZXN1bHQ9bmV3IEFycmF5TGlzdDw+KCk7CgkJZm9yKGludCBpPTA7aTx0b3RhbDtpKyspCgkJCXJlc3VsdC5hZGQoZGlyZWN0KG1hcHBpbmdzLGJhc2UsaSkpOwoJCXJldHVybiByZXN1bHQ7Cgl9CglzdGF0aWMgU3RyaW5nIGRpcmVjdChMaXN0PFN0cmluZ0xpc3RQYWlyPiBtYXBwaW5ncyxTdHJpbmcgYmFzZSxpbnQgaW5kZXgpIHsKCQlmb3IoU3RyaW5nTGlzdFBhaXIgcDptYXBwaW5ncykgewoJCQliYXNlPWJhc2UucmVwbGFjZShwLnMscC5sLmdldChpbmRleCAlIHAubC5zaXplKCkpKTsKCQkJaW5kZXgvPXAubC5zaXplKCk7CgkJfQoJCXJldHVybiBiYXNlOwoJfQoJCglzdGF0aWMgY2xhc3MgU3RyaW5nTGlzdFBhaXJ7CgkJZmluYWwgU3RyaW5nIHM7CgkJZmluYWwgTGlzdDxTdHJpbmc+IGw7CgkJU3RyaW5nTGlzdFBhaXIoU3RyaW5nIHMsTGlzdDxTdHJpbmc+IGwpewoJCQl0aGlzLnM9czsKCQkJdGhpcy5sPWw7CgkJfQoJfQp9