import java.util.Arrays ;
import java.util.concurrent.ExecutorService ;
import java.util.concurrent.Executors ;
import java.util.concurrent.TimeUnit ;
class Ideone {
public static void printUsage( ) {
System .
out .
println ( "Compares a given set of integers and prints the maximum value and its location.\n " + "Usage:\n "
+ " Prog1 <int>, <int>, ...\n "
+ "Where <int> is any valid integer." ) ;
}
static ExecutorService newExecutorService( ) {
return Executors.
newFixedThreadPool ( Runtime .
getRuntime ( ) .
availableProcessors ( ) ) ; }
public static int [ ] parseInputParameters
( final String [ ] args
) { if ( ( args == null ) || ( args.length < 2 ) ) {
System .
out .
println ( "Not enough arguments. Cannot continue." ) ; return null ;
}
final int [ ] result = new int [ args.length ] ;
for ( int i = 0 ; i < args.length ; ++ i) {
try {
result
[ i
] = Integer .
parseInt ( args
[ i
] ) ; System .
out .
println ( "'" + String .
valueOf ( args
[ i
] ) + "' is not a valid integer. Cannot continue." ) ; return null ;
}
}
return result;
}
public static String arrayToString
( final int [ ] integers
) { return Arrays .
toString ( integers
) .
replaceAll ( "[\\ [\\ ],]" ,
"" ) ; }
final ExecutorService executor = newExecutorService( ) ;
final int [ ] result = new int [ inputValues.length ] ;
for ( int i = 0 ; i < result.length ; ++ i) {
final int index = i;
@Override
public void run( ) {
result[ index] = 1 ;
}
} ) ;
}
executor.shutdown ( ) ;
executor.awaitTermination ( 1 , TimeUnit.SECONDS ) ; // if those threads are not done 1 second after submitting them all, we assume a coding error and terminate
return result;
}
static void compareValues
( final int [ ] inputValues,
final int [ ] resultSet
) throws InterruptedException { final ExecutorService executor = newExecutorService( ) ;
int inc = 1 ;
for ( int i = 0 ; i < inputValues.length - 1 ; i++ ) {
for ( int j = inc; j < inputValues.length ; j++ ) {
final int indexLeft = i;
final int indexRight = j;
@Override
public void run( ) {
if ( Integer .
compare ( inputValues
[ indexLeft
] , inputValues
[ indexRight
] ) < 0 ) { resultSet[ indexLeft] = 0 ;
} else {
resultSet[ indexRight] = 0 ;
}
}
} ) ;
}
++ inc;
}
executor.shutdown ( ) ;
executor.awaitTermination ( 1 , TimeUnit.SECONDS ) ; // if those threads are not done 1 second after submitting them all, we assume a coding error and terminate
}
static void printValues
( final int [ ] inputValues,
final int [ ] resultSet
) throws InterruptedException { final ExecutorService executor = newExecutorService( ) ;
for ( int i = 0 ; i < resultSet.length ; i++ ) {
final int index = i;
@Override
public void run( ) {
if ( resultSet[ index] == 1 ) {
System .
out .
println ( "Maximum = " + inputValues
[ index
] + " at index = " + index
) ; }
}
} ) ;
}
executor.shutdown ( ) ;
executor.awaitTermination ( 1 , TimeUnit.SECONDS ) ; // if those threads are not done 1 second after submitting them all, we assume a coding error and terminate
}
public static void main
( String [ ] args
) { final int [ ] inputValues = parseInputParameters( args) ;
if ( inputValues == null ) {
printUsage( ) ;
return ;
}
try {
final int [ ] resultSet = createResultSet( inputValues) ;
System .
out .
println ( "Input values: " + arrayToString
( inputValues
) ) ; System .
out .
println ( "Initialized result set: " + arrayToString
( resultSet
) ) ;
compareValues( inputValues, resultSet) ;
System .
out .
println ( "After comparison: " + arrayToString
( resultSet
) ) ;
printValues( inputValues, resultSet) ;
System .
out .
println ( "Operation interrupted." ) ; }
}
}
aW1wb3J0IGphdmEudXRpbC5BcnJheXM7CmltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CmltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CmltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKCmNsYXNzIElkZW9uZSB7CiBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRVc2FnZSgpIHsKICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ29tcGFyZXMgYSBnaXZlbiBzZXQgb2YgaW50ZWdlcnMgYW5kIHByaW50cyB0aGUgbWF4aW11bSB2YWx1ZSBhbmQgaXRzIGxvY2F0aW9uLlxuIgogICAgICAgICAgICArICJVc2FnZTpcbiIKICAgICAgICAgICAgKyAiICBQcm9nMSA8aW50PiwgPGludD4sIC4uLlxuIgogICAgICAgICAgICArICJXaGVyZSA8aW50PiBpcyBhbnkgdmFsaWQgaW50ZWdlci4iKTsKICB9CgogIHN0YXRpYyBFeGVjdXRvclNlcnZpY2UgbmV3RXhlY3V0b3JTZXJ2aWNlKCkgewogICAgcmV0dXJuIEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2woUnVudGltZS5nZXRSdW50aW1lKCkuYXZhaWxhYmxlUHJvY2Vzc29ycygpKTsKICB9CgogIHB1YmxpYyBzdGF0aWMgaW50W10gcGFyc2VJbnB1dFBhcmFtZXRlcnMoZmluYWwgU3RyaW5nW10gYXJncykgewogICAgaWYgKChhcmdzID09IG51bGwpIHx8IChhcmdzLmxlbmd0aCA8IDIpKSB7CiAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTm90IGVub3VnaCBhcmd1bWVudHMuIENhbm5vdCBjb250aW51ZS4iKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgZmluYWwgaW50W10gcmVzdWx0ID0gbmV3IGludFthcmdzLmxlbmd0aF07CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyArK2kpIHsKICAgICAgdHJ5IHsKICAgICAgICByZXN1bHRbaV0gPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbaV0pOwogICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiJyIgKyBTdHJpbmcudmFsdWVPZihhcmdzW2ldKSArICInIGlzIG5vdCBhIHZhbGlkIGludGVnZXIuIENhbm5vdCBjb250aW51ZS4iKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfQoKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBwdWJsaWMgc3RhdGljIFN0cmluZyBhcnJheVRvU3RyaW5nKGZpbmFsIGludFtdIGludGVnZXJzKSB7CiAgICByZXR1cm4gQXJyYXlzLnRvU3RyaW5nKGludGVnZXJzKS5yZXBsYWNlQWxsKCJbXFxbXFxdLF0iLCAiIik7CiAgfQoKICBzdGF0aWMgaW50W10gY3JlYXRlUmVzdWx0U2V0KGZpbmFsIGludFtdIGlucHV0VmFsdWVzKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewogICAgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gbmV3RXhlY3V0b3JTZXJ2aWNlKCk7CiAgICBmaW5hbCBpbnRbXSByZXN1bHQgPSBuZXcgaW50W2lucHV0VmFsdWVzLmxlbmd0aF07CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7ICsraSkgewogICAgICBmaW5hbCBpbnQgaW5kZXggPSBpOwogICAgICBleGVjdXRvci5zdWJtaXQobmV3IFJ1bm5hYmxlKCkgewoKICAgICAgICBAT3ZlcnJpZGUKICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgICByZXN1bHRbaW5kZXhdID0gMTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgZXhlY3V0b3Iuc2h1dGRvd24oKTsKICAgIGV4ZWN1dG9yLmF3YWl0VGVybWluYXRpb24oMSwgVGltZVVuaXQuU0VDT05EUyk7IC8vIGlmIHRob3NlIHRocmVhZHMgYXJlIG5vdCBkb25lIDEgc2Vjb25kIGFmdGVyIHN1Ym1pdHRpbmcgdGhlbSBhbGwsIHdlIGFzc3VtZSBhIGNvZGluZyBlcnJvciBhbmQgdGVybWluYXRlCiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgc3RhdGljIHZvaWQgY29tcGFyZVZhbHVlcyhmaW5hbCBpbnRbXSBpbnB1dFZhbHVlcywgZmluYWwgaW50W10gcmVzdWx0U2V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewogICAgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gbmV3RXhlY3V0b3JTZXJ2aWNlKCk7CiAgICBpbnQgaW5jID0gMTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXRWYWx1ZXMubGVuZ3RoIC0gMTsgaSsrKSB7CiAgICAgIGZvciAoaW50IGogPSBpbmM7IGogPCBpbnB1dFZhbHVlcy5sZW5ndGg7IGorKykgewogICAgICAgIGZpbmFsIGludCBpbmRleExlZnQgPSBpOwogICAgICAgIGZpbmFsIGludCBpbmRleFJpZ2h0ID0gajsKICAgICAgICBleGVjdXRvci5zdWJtaXQobmV3IFJ1bm5hYmxlKCkgewoKICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICAgICBpZiAoSW50ZWdlci5jb21wYXJlKGlucHV0VmFsdWVzW2luZGV4TGVmdF0sIGlucHV0VmFsdWVzW2luZGV4UmlnaHRdKSA8IDApIHsKICAgICAgICAgICAgICByZXN1bHRTZXRbaW5kZXhMZWZ0XSA9IDA7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgcmVzdWx0U2V0W2luZGV4UmlnaHRdID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICAgICsraW5jOwogICAgfQogICAgZXhlY3V0b3Iuc2h1dGRvd24oKTsKICAgIGV4ZWN1dG9yLmF3YWl0VGVybWluYXRpb24oMSwgVGltZVVuaXQuU0VDT05EUyk7IC8vIGlmIHRob3NlIHRocmVhZHMgYXJlIG5vdCBkb25lIDEgc2Vjb25kIGFmdGVyIHN1Ym1pdHRpbmcgdGhlbSBhbGwsIHdlIGFzc3VtZSBhIGNvZGluZyBlcnJvciBhbmQgdGVybWluYXRlCiAgfQoKICBzdGF0aWMgdm9pZCBwcmludFZhbHVlcyhmaW5hbCBpbnRbXSBpbnB1dFZhbHVlcywgZmluYWwgaW50W10gcmVzdWx0U2V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewogICAgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gbmV3RXhlY3V0b3JTZXJ2aWNlKCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdFNldC5sZW5ndGg7IGkrKykgewogICAgICBmaW5hbCBpbnQgaW5kZXggPSBpOwogICAgICBleGVjdXRvci5zdWJtaXQobmV3IFJ1bm5hYmxlKCkgewoKICAgICAgICBAT3ZlcnJpZGUKICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgICBpZiAocmVzdWx0U2V0W2luZGV4XSA9PSAxKSB7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTWF4aW11bSA9ICIgKyBpbnB1dFZhbHVlc1tpbmRleF0gKyAiIGF0IGluZGV4ID0gIiArIGluZGV4KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgZXhlY3V0b3Iuc2h1dGRvd24oKTsKICAgIGV4ZWN1dG9yLmF3YWl0VGVybWluYXRpb24oMSwgVGltZVVuaXQuU0VDT05EUyk7IC8vIGlmIHRob3NlIHRocmVhZHMgYXJlIG5vdCBkb25lIDEgc2Vjb25kIGFmdGVyIHN1Ym1pdHRpbmcgdGhlbSBhbGwsIHdlIGFzc3VtZSBhIGNvZGluZyBlcnJvciBhbmQgdGVybWluYXRlCiAgfQoKICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICBmaW5hbCBpbnRbXSBpbnB1dFZhbHVlcyA9IHBhcnNlSW5wdXRQYXJhbWV0ZXJzKGFyZ3MpOwogICAgaWYgKGlucHV0VmFsdWVzID09IG51bGwpIHsKICAgICAgcHJpbnRVc2FnZSgpOwogICAgICByZXR1cm47CiAgICB9CgogICAgdHJ5IHsKICAgICAgZmluYWwgaW50W10gcmVzdWx0U2V0ID0gY3JlYXRlUmVzdWx0U2V0KGlucHV0VmFsdWVzKTsKCiAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSW5wdXQgdmFsdWVzOiAiICsgYXJyYXlUb1N0cmluZyhpbnB1dFZhbHVlcykpOwogICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkluaXRpYWxpemVkIHJlc3VsdCBzZXQ6ICIgKyBhcnJheVRvU3RyaW5nKHJlc3VsdFNldCkpOwoKICAgICAgY29tcGFyZVZhbHVlcyhpbnB1dFZhbHVlcywgcmVzdWx0U2V0KTsKCiAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQWZ0ZXIgY29tcGFyaXNvbjogIiArIGFycmF5VG9TdHJpbmcocmVzdWx0U2V0KSk7CgogICAgICBwcmludFZhbHVlcyhpbnB1dFZhbHVlcywgcmVzdWx0U2V0KTsKICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPcGVyYXRpb24gaW50ZXJydXB0ZWQuIik7CiAgICB9CiAgfQp9