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]]