การสร้าง Manipulate และ ArrayList ด้วย JLink
Sep 07 2020
ฉันสงสัยว่าเป็นไปได้ไหมที่จะใส่รหัสนี้ใน Manipulate ฉันลองแบบนี้และได้ผลลัพธ์ในกล่องข้อความ:
จากนั้นเมื่อฉันเลือกคำที่แตกต่างจาก PopMenu ฉันได้สิ่งนี้:
คิดว่าปัญหาคือ...Print[...]คำแนะนำจึงพยายามสร้างอาร์เรย์เช่นนี้ แต่ล้มเหลวโดยสิ้นเชิงไม่มีผลลัพธ์ ...
Needs["JLink`"]
Scanner[archivo_String, palabra_String] :=
JavaBlock@
Module[{entrada, linea, numlinea, contiene, ruta, lista, renglon,
nop}, numlinea = 1; linea = ""; contiene = False;
InstallJava[];
ruta = JavaNew["java.io.File", archivo];
entrada = JavaNew["java.util.Scanner", ruta];
lista = JavaNew["java.util.ArrayList"];
(*Print["File: " <> ruta@getName[]];
Print["Word:" <> palabra];*)
While[entrada@hasNext[], linea = entrada@nextLine[];
If[JavaNew["java.lang.String", linea]@
contains[MakeJavaObject@palabra],
renglon =
JavaNew["java.lang.String",
"Line " <> ToString[numlinea ] <> ": " <> ToString[linea]];
contiene = True;
lista@add[renglon];
JavaObjectToExpression[lista]];
numlinea++];
If[! contiene,
nop = JavaNew["java.lang.String",
ToString[palabra] <> " no se ha encontrado"];
lista@add[nop];
JavaObjectToExpression[lista]]]
ไม่ทราบว่าต้องทำอย่างไรขอขอบคุณสำหรับความช่วยเหลือ
คำตอบ
1 JasonB. Sep 08 2020 at 08:26
นี้มีอะไรจะทำอย่างไรกับหรือManipulate Printดูผลการและคุณจะเห็นว่ามันเป็นScanner[file, "issue"]Null
ดูรหัสของคุณScannerฟังก์ชันจะลงท้ายด้วยคำสั่งเช่นนี้
If[! contiene, <do some stuff>]
คุณไม่มีอาร์กิวเมนต์ที่สามสำหรับIf. และสำหรับคำใด ๆ ที่อยู่ในไฟล์contieneนั่นคือTrueและคุณกำลังประเมินIf[False, <code that is never reached]
ลองสิ่งนี้:
Scanner[archivo_String, palabra_String] := JavaBlock[
Module[
{entrada, linea, numlinea, contiene, ruta, lista, renglon, nop},
numlinea = 1;
linea = "";
contiene = False;
InstallJava[];
ruta = JavaNew["java.io.File", archivo];
entrada = JavaNew["java.util.Scanner", ruta];
lista = JavaNew @ "java.util.ArrayList";
While[entrada @ hasNext[],
linea = MakeJavaObject @ entrada @ nextLine[];
If[linea @ contains @ palabra,
renglon = MakeJavaObject @ StringJoin["Line ", ToString @ numlinea, ": ", JavaObjectToExpression @ linea];
contiene = True;
lista @ add @ renglon;
JavaObjectToExpression @ lista
];
++numlinea
];
If[!contiene,
lista @ add @ MakeJavaObject @ StringJoin[palabra, " no se ha encontrado"]
];
Column @ JavaObjectToExpression @ lista
]
]