Groovy 使用用户输入创建地图地图并搜索结果
我正在尝试创建一个主地图,它应该看起来像Groovy 使用用户输入创建地图地图并搜索结果,groovy,Groovy,我正在尝试创建一个主地图,它应该看起来像 [1:[gender:m, age:1, name:a]]. 我正试图通过创建一个临时地图(student_map)来实现这一点,如下图所示 [gender:m, age:1, name:a] 我想用student_映射作为另一个映射(main_映射)的值,该映射的键值为count(用于序列编号),如下所示 [1:[gender:m, age:1, name:a]] 如果我运行下面的脚本并输入3个条目,则主映射显示计数以3递增,但最后输入的元素迭
[1:[gender:m, age:1, name:a]].
我正试图通过创建一个临时地图(student_map)来实现这一点,如下图所示
[gender:m, age:1, name:a]
我想用student_映射作为另一个映射(main_映射)的值,该映射的键值为count(用于序列编号),如下所示
[1:[gender:m, age:1, name:a]]
如果我运行下面的脚本并输入3个条目,则主映射显示计数以3递增,但最后输入的元素迭代了3次,即使student映射的值正在更改,最终结果是student映射中的最后一个条目迭代了我输入的次数。例如,当我运行代码并通过命令提示符输入值时
1st Entry(through command prompt)
name=a
age=1
gender=m
2nd Entry
name=b
age=2
gender=m
3rd entry
name=c
age=3
gender=m
预期产量
[1:[gender:m, age:1, name:a],2:[gender:m, age:2, name:b],3:[gender:m, age:3, name:c]]
我得到的输出
[1:[gender:m, age:3, name:c], 2:[gender:m, age:3, name:c], 3:[gender:m, age:3, name:c]]
注意:我无法使用下面一行代码搜索此地图的特定值
def result=main_map.find{it.value.name == 'a'} \\This is present in both pieces of code below \\
我在下面粘贴了两段代码(两段都可以,但不是预期的)
代码1-这给了我意外的输出
def answer=System.console().readLine 'Do you want to add a student Y/N\n'
def student_map = new HashMap()
//print student_map.getClass()
def main_map = [:]
//print main_map.getClass()
def count=0
while (answer=='Y' || answer=='y') {
count++
def name=System.console().readLine 'What is your name\n'
def age=System.console().readLine 'What is your age\n'
def gender=System.console().readLine 'What is your gender M/F\n'
student_map.put('name',"${name}")
student_map.put('age',"${age}")
student_map.put('gender',"${gender}")
print student_map
main_map.put("${count}","${student_map}")
print main_map
answer=System.console().readLine 'Do you want to continueY/N\n'
}
print main_map
def name='a'
def result=main_map.find{it.value.name == 'a'}
代码2-这给了我预期的输出,但在搜索值时没有运气
def answer=System.console().readLine 'Do you want to add a student Y/N\n'
def student_map = new HashMap()
//print student_map.getClass()
def main_map = [:]
//print main_map.getClass()
def count=0
while (answer=='Y' || answer=='y') {
count++
def name=System.console().readLine 'What is your name\n'
def age=System.console().readLine 'What is your age\n'
def gender=System.console().readLine 'What is your gender M/F\n'
student_map=[name:(name),age:(age),gender:(gender)]
print student_map
main_map.put("${count}","${student_map}")
print main_map
answer=System.console().readLine 'Do you want to continueY/N\n'
}
print main_map
def name='a'
def result=main_map.find{it.value.name == 'a'}
谢谢你给我的任何帮助
谢谢你的回复,瓦希德雷扎。我已经纠正了这一部分,现在一直在把地图放进一个文件。
我的脚本行下面的行有问题。我不能同时插入键和值,尽管我可以插入键或值
工作
main_map.each {k, v -> writer.print(k)}
o/p from file
12 (i entered two records so the count incremented twice and hence 1 and 2)
不起作用
main_map.each {k, v -> writer.print(k,v)}
全文
def answer=System.console().readLine 'Do you want to add a student Y/N\n'
def student_map = new HashMap()
//print student_map.getClass()
def main_map = [:]
//print main_map.getClass()
def count=0
while (answer=='Y' || answer=='y') {
count++
def name=System.console().readLine 'What is your name\n'
def age=System.console().readLine 'What is your age\n'
def sex=System.console().readLine 'What is your sex M/F\n'
student_map=[name:(name),age:(age),sex:(sex)]
//print student_map
main_map.put((count),(student_map))
//print main_map
answer=System.console().readLine 'Do you want to continueY/N\n'
}
File f = new File ("C:/Apoorv/groovy-2.0.8/Groovy_programs/students.txt")
writer = new PrintWriter(f)
main_map.each {k, v -> writer.print(k,v)}
writer.close()
def student_name = System.console().readLine 'Name to search ?\n'
def result = main_map.find { it.value.name == "${student_name}" }
print result
谢谢你的回复。我已修复了不工作/工作不正常的部件。现在我在将数据放入文件并存储时遇到了一些问题。如前所述,我能够在文件中存储特定记录的键或值,但无法在文件中插入整个记录
更新###我的代码运行良好,正在执行我希望它执行的操作,但排序有一个奇怪的问题###
以下是我的代码供您参考
代码#
输出
[[name:apoorv, age:100, sex:m], [name:manjushree, age:19, sex:f], [name:kaandi, age:21, sex:m]]
如您所见,第二个和第三个条目已排序,但第一个条目未排序。我无法理解排序函数的这种行为
感谢您的帮助您的代码输出对我来说很好。。。我错过什么了吗 Groovy(run.Groovy) 命令
输出看起来是正确的,对吗?您正在ide中运行代码吗?为什么要在
main\u map.put(${count},“${student\u map}”)
中放置student\u map的字符串值,而不是像这样使用它:main\u map.put(${count}),student\u map)
?您知道,在groovy中打印不是序列化的方式吗?处理这个问题的最低要求是使用inspect
(我也不会走这条路)。用json/xml/yaml/edn/序列化。。。也不要把你的阅读/写作和对地图的需求混为一谈。只需建立一个学生列表,并使用groupBy
等工具来建立数据模型。
print main_map.values().sort { a, b -> a.age <=> b.age}
Do you want to add a student Y/N
What is your name
apoorv
What is your age
100
What is your sex M/F
m
Do you want to continueY/N
y
What is your name
kaandi
What is your age
21
What is your sex M/F
m
Do you want to continueY/N
y
What is your name
manjushree
What is your age
19
What is your sex M/F
f
Do you want to continueY/N
n
[[name:apoorv, age:100, sex:m], [name:manjushree, age:19, sex:f], [name:kaandi, age:21, sex:m]]
def answer=System.console().readLine 'Do you want to add a student Y/N\n'
def student_map = new HashMap()
def main_map = [:]
def count=0
while (answer=='Y' || answer=='y') {
count++
def name=System.console().readLine 'What is your name\n'
def age=System.console().readLine 'What is your age\n'
def sex=System.console().readLine 'What is your sex M/F\n'
student_map=[name:(name),age:(age),sex:(sex)]
main_map.put((count),(student_map))
answer=System.console().readLine 'Do you want to continueY/N\n'
}
println main_map
C:\tmp>groovy run.groovy
Do you want to add a student Y/N
y
What is your name
a
What is your age
1
What is your sex M/F
m
Do you want to continueY/N
y
What is your name
b
What is your age
2
What is your sex M/F
m
Do you want to continueY/N
y
What is your name
c
What is your age
3
What is your sex M/F
f
Do you want to continueY/N
n
[1:[name:a, age:1, sex:m], 2:[name:b, age:2, sex:m], 3:[name:c, age:3, sex:f]]