假设我有一个名为“statistic”的字符串。
我想打印“c”作为第二个非重复字符,因为第一个字符是a
。
我确实打印了第一个字符,但却找不到通过那个字符遍历其他键的方法?
另外,如果给出“统计非”,我可以得到“c和o”,因为所有非重复if,指定,先离开,如果指定,“a,c和o”取全部??
我怎样才能做到这一点?
答案 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)
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
希望这有帮助!