2015-04-16 85 views
-1

我正在尝试使用HashMap将整数值分配给大写字母。 我可以给一个字符分配一个值;但是,我需要将每个值存储为特定字符[请记住字母和整数值都由用户指定]。这是我需要帮助的地方。使用hashMap将val分配给字符

我需要将用户定义的整数值存储到用户定义的字符中,并且对于每个字母,如果未分配整数值,那么它保留其在字母表中的位置的整数值。我无法弄清楚如何循环并为此使用HashMap对象

目前我存储在焦炭作为>>>mapObj.put(ch,intValue);

int值,并呼吁为>>int getValue = mapObj.get(ch);

但如果可能的话,它只会调用我想要同时调用字母和值的值。

我试过循环它,并循环它,这两个我都可以得到正确的逻辑。

Map<Character, Integer> mapObj = new HashMap<Character, Integer>(); 
Scanner kbd = new Scanner(System.in); 
String str = " "; 
char ch = ' '; 
int startIndex; 
int strLength; 
int value = 0; 
String strValue = " "; 
while(kbd.hasNext()) 
{ 
    str = kbd.nextLine(); 
    if(str.equals("QUIT")) 
    { 
     break; 
    } 
    else 
    { 
     ch = str.charAt(0); 
     startIndex = str.lastIndexOf(" ")+1; 
     StringLength = str.length(); 
     strValue = str.substring(startIndex,StringLength); 
     value = Integer.parseInt(strValue); 

     System.out.println(""+strValue); 
     tempIndex.put(ch,value); 
     int VarValue = tempIndex.get(ch); 
     System.out.println(ch+" = "+VarValue); 
    } 
} 
+2

分享你的研究可以帮助每个人。告诉我们你试过的东西以及为什么 它不符合你的需求。这表明你已经花时间 试图帮助自己,它使我们避免重申明显的答案, ,最重要的是它可以帮助您获得更具体和相关的答案! 另请参阅[如何问](http://stackoverflow.com/questions/how-to-ask) –

+0

也许一个明显的答案,我需要大声笑。我没有尝试太多,只是无法弄清楚它的逻辑我想是最好的方式来总结我的努力,形成一个循环 – Lex

+0

请发布你有的代码。另外,你是否考虑过使用'Character'键和一个[POJO](http://en.wikipedia.org/wiki/Plain_Old_Java_Object)值? –

回答

0

开始通过创建一个Map<Character, Integer>,并用它填充{A - Z}{1 - 26}

Map<Character, Integer> map = new HashMap<>(); 
for (int i = 0; i + 'A' <= 'Z'; i++) { 
    char key = (char) ('A' + i); 
    int defaultValue = i + 1; 
    map.put(key, defaultValue); 
} 

如果我们牛逼ø现在运行System.out.println(map);我们将看到

{A = 1,B = 2,C = 3,d = 4,E = 5,F = 6,G = 7,H = 8,I = 9, J = 10,K = 11,L = 12,M = 13,N = 14,O = 15,P = 16,Q = 17,R = 18,S = 19,T = 20,U = 21, 22,W = 23,X = 24,Y = 25,Z = 26}

这意味着map现在初始化。接下来,我会使用hasNextLine()nextLine()以及更通用的Scanner名称。如果您想使用由文件支持的Scanner,该怎么办?我会使用String.split(String)将输入分隔为令牌。类似的,

Scanner scan = new Scanner(System.in); 
while (scan.hasNextLine()) { 
    String line = scan.nextLine(); 
    if ("quit".equalsIgnoreCase(line)) { 
     break; 
    } 
    if (!line.isEmpty()) { 
     String[] arr = line.toUpperCase().split("\\s+"); 
     char ch = arr[0].charAt(0); 
     int val = Integer.parseInt(arr[arr.length - 1]); 
     if (ch >= 'A' && ch <= 'Z') { 
      map.put(ch, val); 
     } 
    } 
} 
System.out.println(map); // <-- output after getting all of the input 
0

没有给你代码(功课),有两种不同的情况下,这里发生了(如果我正确地理解你的问题):

  1. 的烧烤C有一个整数分配 - >回分配的整数
  2. 的烧烤C不用有一个整数 - 回复C的字母位置

这可以通过以下方式实现:

  1. 首先填充分配给整数1-26字母AZ的地图 - 这将加紧“第n个字母”映射
  2. 让用户指定步骤1(覆盖任务自定义任务呼叫map.put()再次覆盖)

现在你有一个地图,你想要什么。

+0

它会看起来像'Map mapObj = new HashMap (26,A-Z); ' – Lex

+0

'A-Z'是否是正确的编码方式?这就是我在实例化对象 – Lex

0

如果以前只有26个值要存储在地图中,为什么不对可怜的旧微处理器有一点机械的同情心,而只是使用一个数组?

例如,HashMap的实现......

package stackoverflow; 

import java.util.HashMap; 
import java.util.Map; 

public class MapVsArray1 { 

    public static void main(String[] args) { 
     String input = "The quick lazy fox forgets how to type the sentance so that each letter appears only once and something to do with jumping over something"; 

     Map<Character, Integer> map = new HashMap<>(); 

     for (int k = 0; k < input.length(); k++) { 
      char key = Character.toUpperCase(input.charAt(k)); 

      if (key >= 'A' && key <= 'Z') { 
       Integer currentCount = map.get(key); 

       if (currentCount == null) { 
        currentCount = 0; 
       } 

       currentCount++; 
       map.put(key, currentCount); 
      } 
     } 

     // Output results (rely on HashMap's toString)... 
     System.out.println(map); 

    } 
} 

输出:

{D=2, E=14, F=2, G=4, A=7, C=4, L=3, M=3, N=8, O=12, H=8, I=5, J=1, K=1, U=2, T=14, W=2, V=1, Q=1, P=4, S=6, R=4, Y=3, X=1, Z=1} 

使用数组而...

package stackoverflow; 


public class MapVsArray2 { 

    public static void main(String[] args) { 
     String input = "The quick lazy fox forgets how to type the sentance so that each letter appears only once and something to do with jumping over something"; 

     int[] counts = new int[26]; 

     for (int k = 0; k < input.length(); k++) { 
      char key = Character.toUpperCase(input.charAt(k)); 

      if (key >= 'A' && key <= 'Z') { 
       counts[key - 'A']++; 
      } 
     } 

     // Output results... 
     for (int i = 0; i < counts.length; i++) { 
      char letter = (char) ('A' + i); 
      System.out.print(letter + "=" + counts[i] + " "); 
     } 

    } 
} 

输出...

A=7 B=0 C=4 D=2 E=14 F=2 G=4 H=8 I=5 J=1 K=1 L=3 M=3 N=8 O=12 P=4 Q=1 R=4 S=6 T=14 U=2 V=1 W=2 X=1 Y=3 Z=1 

基本上,阵列解决方案的计算成本较低。

+0

时出现的困惑,B的输出应该按照它的字母顺序是1和0.所以这是行不通的。 – Lex

+0

重新阅读该程序应该执行的操作。这只是一个字母数。 – Lex

+1

@Lex对不起,我刚刚在一个“为什么使用hashmaps只存储26件东西”一个......如果它不被认为是相关的,我会很快删除这个帖子(downvote如果需要的话...... :() – BretC

0

已经读了十遍以上的问题,但仍然不明白你在问什么。你说

我已经尝试了循环它,而循环它,这两者我都可以得到逻辑正确。

我敢打赌,你要求的方式迭代Map条目的权利? (我不能看到你引用反正你无关的代码点...)

如果是的话,这里就是我们通常做的:

Map<Foo, Bar> myMap = ....; 

for (Map.Entry<Foo,Bar> entry : myMap.entrySet()) { 
    System.out.println("key is a Foo, which is " + entry.getKey()); 
    System.out.println("value is a Bar which is " + entry.getValue()); 
} 
+0

什么是入口和入口集? – Lex

+0

我认为您需要的是一本Java初学者书籍,并通读它,并确保您了解基础知识。如果可以,很难沟通甚至不理解'entry'是一个变量名,而'entrySet()'是'Map'的一个方法(为此你可以阅读Javadoc来理解它的作用) –