Il s'agit de la version Java du ** [[paiza] [C #]] précédemment publié (http://qiita.com/ryo1224/items/3d20f4abbadd9318decc) ** que j'ai créé mon propre utilitaire pour répondre aux questions.
Java semble être couramment nommé xxx4j, alors je l'ai nommé PaizaUtil4J.
** Note révisée: **
La fonctionnalité et l'utilisation sont les mêmes que la version C #, je vais donc l'omettre cette fois.
** (* '▽') Pour ceux qui ont besoin d'explications, veuillez vous référer à l'article que j'ai écrit plus tôt. ** **
PaizaUtility.java
public class PaizaUtility
{
public interface ITestIO
{
String readLine();
void writeLine(String line);
}
public static class ConsoleProxy implements ITestIO
{
private final Scanner in = new Scanner( System.in );
@Override
public String readLine()
{
return in.nextLine();
}
@Override
public void writeLine(String line)
{
System.out.println( line );
}
}
static ITestIO io;
// static ctor
static {
io = new ConsoleProxy();
}
public static Iterable<String> readArgs()
{
String s = io.readLine();
int n = Integer.valueOf( s );
return readArgs( n );
}
public static Iterable<String> readArgs(final int n)
{
List<String> args = new ArrayList<String>();
for ( int i = 0; i < n; i++ )
{
String arg = io.readLine();
args.add( arg );
}
return args;
}
public interface IFunction<TResult, TParameter>
{
TResult invoke( TParameter parameter );
}
public static Iterable<String> readArgs( IFunction<Integer, String> parseHeaderRecord ) {
String header = io.readLine();
int n = parseHeaderRecord.invoke( header ).intValue();
return readArgs( n );
}
// static class.
private PaizaUtility() { }
}
Do.java (où implémenter la logique de réponse pour les questions paiza)
public class Do
{
public static void answer()
{
// //Si vous écrivez le délégué IFunction en lambda, vous obtiendrez ce code.
// Iterable<String> args = PaizaUtility.readArgs(
// s -> Integer.parseInt( s )
// );
Iterable<String> args = PaizaUtility.readArgs();
for ( String arg : args )
{
PaizaUtility.io.writeLine( arg );
}
}
}
Program.java (point d'entrée principal du programme)
public class Program
{
public static void main( String[] args )
{
PaizaUtility.io = new DebugIO();
Do.answer();
}
}
Ainsi, l'implémentation de la classe DebugIO essentielle n'a pas encore été finalisée.
Program.DebugIO
private static class DebugIO implements ITestIO
{
//C pour java#Il n'y a pas de notation littérale de chaîne de caractères séquentielle comme celle-ci, donc c'est terne, que dois-je faire?
private final String[] source = {
"2",
"hello",
"world",
};
private int index = 0;
@Override
public String readLine()
{
return index < source.length ? source[index++] : null;
}
@Override
public void writeLine(String line)
{
System.out.println( line );
}
}
En C #, il existe une spécification de syntaxe appelée ** littéral de chaîne séquentielle **, mais Java n'a pas la fonction équivalente. Pour cette raison, dans la version C #, les paramètres de question de paiza peuvent être utilisés tels quels depuis l'écran Web en copiant, mais dans la version Java, la même main ne peut pas être utilisée. Qu'est-ce qui ne va pas?
Désolé pour le style de code C #! !! Je suis originaire de C #, pas de Java, et j'aime mieux C # que Java linguistiquement! !!
problème de classe statique.
Vous pouvez créer une classe statique en C #, mais vous ne pouvez pas créer une classe statique en Java.
Comme vous ne pouvez pas créer de classe statique en Java, vous n'ajoutez pas le mot-clé static à la classe externe (du côté englobant en Java). Pour cette raison, spécifiquement, le mot-clé static n'est pas ajouté aux deux classes PaizaUtility et Do, donc si vous copiez et collez tel quel, une erreur de compilation se produira.
Si vous voulez résoudre ce problème de force, vous pouvez envelopper les deux classes en question avec une classe englobante factice et les déposer dans le membre statique interne, mais je me demande ce que c'est.
Il semble que la classe Scanner n'ait pas été utilisée correctement, et elle était normalement boguée et ne pouvait pas être utilisée avec paiza. (Pour être exact, il y avait des cas où il ne pouvait pas être utilisé)
ConsoleProxy (avant modification)
@Override
public String readLine()
{
return in.next();
}
ConsoleProxy (après modification)
@Override
public String readLine()
{
return in.nextLine();
}
Quel gâchis (´ ・ ω ・ `)
Je ne fais pas tellement d'E / S standard en Java, donc j'ai été frappé par l'implémentation du code officiel paiza acquisition de valeur / exemple de sortie tel quel. Je suis désolé de ne pas avoir bien vérifié, mais ...
Informations de référence: C'était utile parce qu'il y avait une personne qui était accro à un endroit similaire.
Je n'ai pas bien compris le comportement de Java Scanner et .nextLine ()
DebugIO (extrait du constructeur uniquement)
public DebugIO()
{
super();
this.source = readDataSource();
}
private static String[] readDataSource()
{
//Pour le moment, je vais lire à partir du fichier texte avec un chemin relatif.
Path path = Paths.get( "dat/datasource.txt" );
try
{
return Files.lines( path ).toArray( String[]::new );
}
catch ( IOException ex )
{
//C'est un cas absolument impossible, donc tout va bien, mais je vais le vider pour le moment.
ex.printStackTrace();
return new String[]{};
}
}
dat/datasource.txt
3
hoge
moge
piyo
Résultat d'exécution
hoge
moge
piyo
La solution complète peut être trouvée sur GitHub. À l'avenir, je prévois d'ajouter des commentaires, d'améliorer les fonctions et de jouer avec diverses choses.
https://github.com/sugaryo/PaizaUtil4J
Recommended Posts