Dies ist die Java-Version des zuvor veröffentlichten ** [[paiza] Ich habe mein eigenes Dienstprogramm zum Beantworten von Fragen [C #]] erstellt (http://qiita.com/ryo1224/items/3d20f4abbadd9318decc) **.
Java scheint allgemein xxx4j zu heißen, also habe ich es PaizaUtil4J genannt.
** Überarbeitetes Memo: **
Die Funktionalität und Verwendung sind die gleichen wie in der C # -Version, daher werde ich diesmal darauf verzichten.
** (* '▽') Für diejenigen, die eine Erklärung benötigen, lesen Sie bitte den Artikel, den ich zuvor geschrieben habe. ** ** **
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 (wo man die Antwortlogik für Paiza-Fragen implementiert)
public class Do
{
public static void answer()
{
// //Wenn Sie den IFunction-Delegaten in Lambda schreiben, erhalten Sie diesen 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 (Haupteinstiegspunkt des Programms)
public class Program
{
public static void main( String[] args )
{
PaizaUtility.io = new DebugIO();
Do.answer();
}
}
Die Implementierung der wesentlichen DebugIO-Klasse ist also noch nicht abgeschlossen.
Program.DebugIO
private static class DebugIO implements ITestIO
{
//C für Java#Es gibt keine solche sequentielle Zeichenketten-Literalnotation wie diese. Es ist also langweilig. Was soll ich tun?
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 );
}
}
In C # gibt es eine Syntaxspezifikation namens ** sequentielles String-Literal **, aber Java hat nicht die entsprechende Funktion. Aus diesem Grund können in der C # -Version die Fragenparameter von paiza so verwendet werden, wie sie vom Webbildschirm stammen, indem sie kopiert werden. In der Java-Version kann jedoch nicht dieselbe Hand verwendet werden. Was ist los?
Entschuldigung für den C # -ähnlichen Codestil! !! Ich komme ursprünglich aus C #, nicht aus Java, und ich mag C # sprachlich besser als Java! !!
statisches Klassenproblem.
Sie können eine statische Klasse in C # erstellen, in Java jedoch keine statische Klasse.
Da Sie in Java keine statische Klasse erstellen können, fügen Sie der äußeren Klasse (auf der einschließenden Seite in Java) das statische Schlüsselwort nicht hinzu. Insbesondere aus diesem Grund wird das statische Schlüsselwort nicht zu den beiden Klassen PaizaUtility und Do hinzugefügt. Wenn Sie also so kopieren und einfügen, wie es ist, tritt ein Kompilierungsfehler auf.
Wenn Sie dies gewaltsam lösen möchten, können Sie die beiden fraglichen Klassen mit einer Dummy-Klasse umschließen und sie in das innere statische Element ablegen, aber ich frage mich, was es ist.
Es scheint, dass die Scanner-Klasse falsch verwendet wurde und normalerweise fehlerhaft war und nicht mit Paiza verwendet werden konnte. (Um genau zu sein, gab es Fälle, in denen es nicht verwendet werden konnte)
ConsoleProxy (vor der Änderung)
@Override
public String readLine()
{
return in.next();
}
ConsoleProxy (nach Änderung)
@Override
public String readLine()
{
return in.nextLine();
}
Was für ein Durcheinander (´ ・ ω ・ `)
Ich mache in Java nicht so viele Standard-E / A-Vorgänge, daher war ich beeindruckt von der Implementierung des offiziellen Paiza-Beispielcodes (https://paiza.jp/guide/samplecode). Es tut mir leid, dass ich es nicht gut überprüft habe, aber ...
Referenzinformationen: Es war hilfreich, weil es eine Person gab, die von einem ähnlichen Ort abhängig war.
Ich habe das Verhalten von Java Scanner und .nextLine () nicht gut verstanden
DebugIO (nur Auszug aus dem Konstruktor)
public DebugIO()
{
super();
this.source = readDataSource();
}
private static String[] readDataSource()
{
//Vorerst werde ich aus der Textdatei mit einem relativen Pfad lesen.
Path path = Paths.get( "dat/datasource.txt" );
try
{
return Files.lines( path ).toArray( String[]::new );
}
catch ( IOException ex )
{
//Es ist ein absolut unmöglicher Fall, also ist alles in Ordnung, aber ich werde es vorerst leeren.
ex.printStackTrace();
return new String[]{};
}
}
dat/datasource.txt
3
hoge
moge
piyo
Ausführungsergebnis
hoge
moge
piyo
Die komplette Lösung finden Sie auf GitHub. In Zukunft möchte ich Kommentare hinzufügen, Funktionen verbessern und mit verschiedenen Dingen spielen.
https://github.com/sugaryo/PaizaUtil4J
Recommended Posts