如何找到第二个或任何其他顺序,比如字符串中的第3个,第4个非重复字符?

时间:2016-09-29 09:21:41

标签: java collections

假设我有一个名为“statistic”的字符串。

我想打印“c”作为第二个非重复字符,因为第一个字符是a

我确实打印了第一个字符,但却找不到通过那个字符遍历其他键的方法?

另外,如果给出“统计非”,我可以得到“c和o”,因为所有非重复if,指定,先离开,如果指定,“a,c和o”取全部??

我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:0)

简单地遍历字符串并将每个字符的出现放在一个映射中,其中键是字符,值是一个具有两个属性的对象,即出现次数和第一次出现位置。

然后根据位置对该映射的keySet()进行简单排序,并迭代排序集,直到找到只有一个出现的对象

   for(int i=0;i<str.length();i++) {
       if(map.get(str.chatAt(i))==null) {
           map.put(str.charAt(i),new Wrapper(i,1)) ;
        } else {
           map.get(str.charAt(i)).occurence++;
        }

   }



     class Wrapper {
        public int occurrence;
        public int position;
        public Wrapper(int position,int occurrence) {

        this.position = position;
        this.occurrence = occurrence;
       }


      }

答案 1 :(得分:0)

使用LinkedHashMap

  

Map接口的哈希表和链表实现,具有可预测的迭代顺序。 ...此链接列表定义迭代排序,通常是键插入映射的顺序(插入顺序)。 请注意,如果将密钥重新插入地图,则不会影响广告订单。

有了这个,就变得容易了:

// We keep only a map of between tha char and the number of
// occurrences. We don't store the positions for the next (after first)
// occurrences, but the LinkedHashMap guarantees that
// the iteration order is the same as  insertion order
// (so first inserted letters will appear first when iterating)
LinkedHashMap<Character, Integer> charOccurs=new LinkedHashMap<>();

for(char c : str) {
  Integer occ=charOccurs.get(c);
  if(null==occ) {
    occ=0;
  }
  else {
    occ=new Integer(occ.intValue()+1);
  }
  // "Note that insertion order is not affected 
  // if a key is re-inserted into the map."
  // Niiice!
  charOccurs.put(c, occ);
}

int order=1;
for(Map.Entry<Character, Integer> entry : charOccurs.entrySet()) {
  // this works because ...
  // "This linked list defines the iteration ordering,
  // which is normally the order in which keys were inserted"
  // Doubly-nice!!!
  if(1==entry.getValue()) { // single occurrence
    System.out.println("Char: "+entry.getKey()+" order: "+order);
    order++; 
  }
}

答案 2 :(得分:0)

我想你会想要通过旧的skool方法

String intitialString = "statistic non";
        int count = 0;
        char[] ch = intitialString.toCharArray();
        for (int i = 0; i < ch.length; i++) {
            for (int j = 0; j < ch.length; j++) {
                if (ch[i] == ch[j]) {
                    count++;
                }
            }
            if (count > 1) {
                count = 0;
            } else
                System.out.println(ch[i]);
        }

<强>输出

a
c
o

希望这有帮助!