2010-07-23 66 views
1

打印值基于指数

NavigableMap<Integer,String> nmap = 
     new TreeMap<Integer,String>(); 

    nmap.put(3, "Three"); 
    nmap.put(1, "One"); 
    nmap.put(4, "Four"); 
    nmap.put(5, "Five"); 
    nmap.put(7, "Seven"); 
    nmap.put(10, "Ten"); 


System.out.println(nmap); 
// {1=One, 3=Three, 4=Four, 5=Five, 7=Seven, 10=Ten} 

有没有一种机制,可以让我通过索引值打印此,印刷,如果指数是从较小超过1以下索引打印 - (破折号):

一, - ,三,四,五, - ,六,七, - , - ,十

如何将我写的功能呢?

我不必打印整张地图的字符串我的意思是每个键/值对

+0

你真的想把它变成一个字符串吗?或者你想要一个数组:“{”One“,null,”Three“,”Four“,”Five“,null,null,”Seven“}'? – Eric 2010-07-23 12:35:38

回答

1

这里是一个广义的解决方案,这也确实串联。我的泛型knownledge是有些冒险,所以不要奇怪的错误感到惊讶:

static <V> List<V> NMapToList(NavigableMap<Integer,V> nmap, V emptyEntryValue) 
{ 
    Integer next = null; 
    List<V> list = new ArrayList<V>(); 

    for(NavigableMap.Entry<Integer, V> e : nmap.entrySet()) 
    { 
     Integer current = e.getKey(); 

     if(next != null) 
      for(int i = next; i < current; i++) 
       list.add(emptyEntryValue); 
     list.add(e.getValue()); 

     next = current + 1; 
    } 

    return list; 
} 

static String listToString(List<?> l, String separator) 
{ 
    StringBuilder sb = new StringBuilder("("); 
    String sep = ""; 
    for (Object object : l) 
    { 
     sb.append(sep).append(object.toString()); 
     sep = separator; 
    } 
    return sb.append(")").toString(); 
} 

String s = listToString(NMapToList(nmap,'-'),','); 
+0

你在正确的轨道,但我得到这个输出[一,四,五,] – 2010-07-23 12:44:54

+0

你在这有些编译错误是固定的http://pastebin.ca/1906815 – 2010-07-23 12:47:28

+0

我没有看到区别。我做了另一次改变。我忘了提供参数 – Eric 2010-07-23 12:51:57

0

你必须创建树形图一个新的子类,并重写toString方法。

+0

我不必打印整张地图的字符串我意味着earh键/值对 – 2010-07-23 12:18:41

1

未经检验的,但应该工作:

public String myToString(final NavigableMap<Integer, String> nmap) { 
    StringBuilder sb = new StringBuilder(); 
    Integer lastKey = null; 
    for (Map.Entry<Integer, String> entry : nmap.entrySet()) { 
     Integer key = entry.getKey(); 
     if (lastKey != null) { 
      for (int i=(lastKey+1); i<key; i++) { 
       sb.append(",-"); 
      } 
     } 
     if (sb.length() != 0) { 
      sb.append(","); 
     } 
     sb.append(entry.getValue()); 
     lastKey = key; 
    } 
    return sb.toString(); 
} 
+0

我修正了这段代码编译的问题,这里是http://pastebin.ca/1906823,但是它产生这个输出,一,三,四,五,七我不知道如何修复它 – 2010-07-23 12:51:50

+0

@Gandalf:那是因为你的修复是错误的。 '.equals(null)'不会产生任何有用的东西。我从来不想在'Map'上调用'.lastKey()'。我已经修复了代码。它为我编译并生成正确的输出。 – 2010-07-23 13:00:25

+0

如果只有一个映射关键字丢失,即“一,三,四,五, - ,六”,但是如果案例不止一个,则缺失即“一,三,四,五, - ,六, - , - ,Nine'我更新了我的问题 – 2010-07-29 22:17:39

0

您应该使用NavigableMap的,它返回的NavigableSet<K> navigableKeySet()方法包含在此映射中的键的NavigableSet视图。集合的迭代器按照升序返回键。然后迭代Set并从NavigableMap中获取值。

编辑: 要使用此System.out.println(nmap);您应该从NavigableMap继承子类,并使用我之前编写的步骤重写toString()方法。

+0

不,它; S更好地遍历的entrySet'()'键:'为(NavigableMap.Entry E:nmap.entrySet())' – Eric 2010-07-23 13:47:52

+0

是的,你是对的。这样更有效率。感谢名单! – 2010-07-23 13:55:50