Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
第一个重复字符串java_Java_String - Fatal编程技术网

第一个重复字符串java

第一个重复字符串java,java,string,Java,String,好的,我知道这个问题在这里被问了很多次,但我仍然不明白,如何找到字符串中第一个重复的字符? 我做了一件很接近的事情,但它给了我所有重复的字符,而不是第一个。 以下是我所做的: private static void stringChar(){ String s = "sababa"; int count = 0; char c[] = s.toCharArray(); System.out.println("Duplicate characters are :"

好的,我知道这个问题在这里被问了很多次,但我仍然不明白,如何找到字符串中第一个重复的字符? 我做了一件很接近的事情,但它给了我所有重复的字符,而不是第一个。 以下是我所做的:

private static void stringChar(){
    String s = "sababa";
    int count = 0;
    char c[] = s.toCharArray();

    System.out.println("Duplicate characters are :");

    for(int i = 0; i < s.length(); i++){
       for(int j = i + 1; j < s.length(); j++){
           if(c[i] == c[j]) {
               System.out.println(c[j]);
               count++;
               break;
           }
       }
   }
}
private static void stringChar(){
字符串s=“sababa”;
整数计数=0;
char c[]=s.toCharArray();
System.out.println(“重复字符为:”);
对于(int i=0;i
如果已经找到重复字符,则需要中断外部循环

boolean found = false;
for(int i = 0; i < s.length(); i++){
   for(int j = i + 1; j < s.length(); j++){
       if(c[i] == c[j]) {
           System.out.println(c[j]);
           found = true;
           break;
       }
   }
   if (found) {
       break;
   }
}
boolean-found=false;
对于(int i=0;i
如果你想数一数的话

int count = 0;
char repeatingChar = '0'; //dummy to overcome compiler warning
for(int i = 0; i < s.length(); i++){
   for(int j = i + 1; j < s.length(); j++){
       if(c[i] == c[j]) {
           repeatingChar = c[j];
           count++;
       }
   }
   if (count > 0) {
       System.out.println("Repeating char is " + repeatingChar + ". Occurred " + count + " times");
       break;
   }
}
int count=0;
char repeatingChar='0'//克服编译器警告的虚拟方法
对于(int i=0;i0){
System.out.println(“重复字符为“+repeatingChar+”。发生“+count+”次”);
打破
}
}
想到的一个快速而肮脏(但有效)的方法是维护一个以字符为键的地图。在这种情况下,我们甚至不需要正式的映射,因为我们可以使用一个整数数组映射到字符的底层ASCII值

这里的基本思想是遍历字符串,并检查数组(如果我们以前见过)。如果是,则打印该字符并退出

int[] nums = new int[128];    // assuming only basic ASCII characters
String str = "stuff";
for (int i=0; i < str.length(); ++i) {
int index = str.charAt(i);
    if (nums[index] != 0) {
        System.out.println("The first repeated character is: " + str.charAt(i));
        break;
    }
    ++nums[index];
}
int[]nums=newint[128];//仅假设基本ASCII字符
String str=“stuff”;
对于(int i=0;i

在迭代字符串中的字符时,第一个重复的字符是您以前看到的字符。您可以跟踪第一次看到带有布尔数组的字符。数组用char值编制索引。Java会自动将字符“加宽”为int。因此,对于每个字符,检查它之前是否被看到,如果没有,则标记它已经被看到

String s = "sababa";
boolean[] seenChars = new boolean[Character.MAX_VALUE + 1]; // initialized to all false.
for (char c : s.toCharArray()) {
    if (Character.isSurrogate(c)) throw new IllegalArgumentException("No first char seen before seeing a surrogate. This algorithm doesn't work for codepoints needing surrogates in UTF-16.");
    if (seenChars[c]) {
        System.out.println("First repeated char is: " + c);
        break;  
    }
    seenChars[c] = true;
}

你可能注意到我说的是char而不是character。性格不是一个定义明确的术语。Java的文本数据类型使用字符集的UTF-16编码。某些Unicode代码点需要两个代码单元(
char
),有时称为代理项对。由于它们并非作为单个字符都是唯一的,因此如果它们存在,则该算法不起作用。例如,尝试
String s=“sab简短>

void findFirstDupChar() {
        String s = "google";
        Integer dupIndex = s.length() - 1;
        boolean isDuplicateExists = false;
        Map<Character, Integer> map = new LinkedHashMap<>();

        char[] words = s.toCharArray();
        for (int i = 0; i < words.length; i++) {
            Integer index = map.put(words[i], i);
            if (index != null) {
                if (index < dupIndex) {
                    dupIndex = index;
                    isDuplicateExists = true;
                }
            }
        }
        System.out.println(isDuplicateExists ? words[dupIndex] + ", index=" + dupIndex : "No duplicateds found");
    }
void findFirstDupChar(){
字符串s=“谷歌”;
整数dupIndex=s.length()-1;
布尔值isDuplicateExists=false;
Map Map=newlinkedhashmap();
char[]words=s.toCharArray();
for(int i=0;i
这将按如下方式打印输出>
g、 index=0

如果不使用嵌套for循环,我如何解决这个问题?必须有某种方法来解决这个问题,或者使用1 for循环,或者使用2分隔for循环。@JohnMason您可以使用一个映射或列表,如Tim Biegeleisen的回答所示。如何使用HashSet?@JohnMason使用
HashSet
HashSet