[Paiza] J'ai créé mon propre utilitaire pour répondre aux questions [Java]

■ J'ai créé une version Java de Paiza Utility.

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: **

[Versions 1 et 2] Seules les fonctions de base ont été portées sur Java pour le moment.

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.

◇ Implémentation temporaire de la classe DebugIO actuelle

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 );
		}
	}

◇ Problèmes avec la classe DebugIO.

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?

◇ Cela n'a pas vraiment d'importance

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èmes avec la version Java

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 y avait un bug > <

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 ()

[Version 3] Prise en charge des chaînes de caractères séquentielles (entrée de fichier)

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

■ Cliquez ici pour un ensemble de solutions

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

[Paiza] J'ai créé mon propre utilitaire pour répondre aux questions [Java]
J'ai mis à jour mon propre blackjack réalisé avec Ruby pour mon portfolio
J'ai créé mon propre PC pour le deep learning. (Windows10, double démarrage Ubuntu18.04)
J'ai créé un outil Diff pour les fichiers Java
J'ai créé mon propre outil Instagram automatique [Ruby]
J'ai fait une roulette à Java.
[java] Ce que j'ai fait en comparant des listes dans ma propre classe
Création d'une méthode pour demander Premium Friday (version Java 8)
J'ai créé une application shopify @java
J'ai fait une annotation en Java.
[Java Spring MVC] Je souhaite utiliser DI dans ma propre classe
Java pour tous! J'ai lu tout le monde en Java #minjava
J'ai essayé le mappeur d'objets de Cassandra pour Java
J'ai créé un plug-in pour IntelliJ IDEA
J'ai créé un nouvel outil de déploiement Java