如何从java中的字符串中删除重复的字符?

时间:2013-10-24 23:19:46

标签: java character duplicate-removal mode

在我的程序中,用户输入一个字符串,它首先找到字符串中最大的字符模式。接下来,我的程序应该删除字符串中所有字符的重复项(用户输入:aabc,程序打印:abc),我不完全确定如何操作。我可以让它从一些字符串中删除重复项,但不是全部。例如,当用户输入“aabc”时,它将打印“abc”,但如果用户输入“aabbhh”,则会打印“abbhh”。另外,在我将removeDup方法添加到程序之前,它只会打印一次maxMode,但是在我添加removeDup方法之后,它开始两次打印maxMode。如何防止它两次打印?

注意:我无法将字符串转换为数组。

import java.util.Scanner;

public class JavaApplication3 {
static class MyStrings {
    String s;

void setMyStrings(String str) {
    s = str;    
}

int getMode() {
        int i;
        int j;
        int count = 0;
        int maxMode = 0, maxCount = 1;
        for (i = 0; i< s.length(); i++) {
            maxCount = count;
            count = 0;
            for (j = s.length()-1; j >= 0; j--) {
                if (s.charAt(j) == s.charAt(i))
                    count++;
                if (count > maxCount){
                    maxCount = count;
                    maxMode = i;
                }
            }       
        }
        System.out.println(s.charAt(maxMode)+" = largest mode");

      return maxMode;  
}

    String removeDup() {
       getMode();
       int i;
       int j;
       String rdup = "";

       for (i = 0; i< s.length(); i++) {
           int count = 1;
           for (j = 0; j < rdup.length(); j++) {
               if (s.charAt(i) == s.charAt(j)){
                    count++;
               }
           }
           if (count == 1){
               rdup += s.charAt(i);
               }
           } 
           System.out.print(rdup);
           System.out.println();
           return rdup;
       }


}

public static void main (String[] args) {
Scanner in = new Scanner(System.in);
MyStrings setS = new MyStrings();

    String s;

            System.out.print("Enter string:");
            s = in.nextLine();

            setS.setMyStrings(s);
            setS.getMode();
            setS.removeDup();


}

}

12 个答案:

答案 0 :(得分:2)

尝试这种方法......应该可以正常工作!

String removeDup() 
{         
   getMode();
   int i;
   int j;
   String rdup = "";

   for (i = 0; i< s.length(); i++) {
       int count = 1;

       for (j = i+1; j < s.length(); j++) {
           if (s.charAt(i) == s.charAt(j)) {
                count++;
           }
       }
       if (count == 1){
           rdup += s.charAt(i);
       }
   } 
     //  System.out.print(rdup);
   System.out.println();
   return rdup;
}

答案 1 :(得分:1)

欢迎使用StackOverflow!

您在getMode()的内部和内部都在呼叫removeDup(),这就是它打印两次的原因。

为了删除所有重复项,您必须反复调用removeDup(),直到所有重复项都从您的字符串中消失。现在你只调用一次。

你怎么能这样做?考虑一下您如何检测重复项,并将其作为while循环或类似循环的最终条件。

快乐的编码!

答案 2 :(得分:1)

这不应该是一种更简单的方法吗?另外,我还在学习。

import java.util.*;

public class First {

public static void main(String arg[])
{
    Scanner sc= new Scanner(System.in);
    StringBuilder s=new StringBuilder(sc.nextLine());        
    //String s=new String();
    for(int i=0;i<s.length();i++){
        String a=s.substring(i, i+1);
        while(s.indexOf(a)!=s.lastIndexOf(a)){s.deleteCharAt(s.lastIndexOf(a));}
    }
    System.out.println(s.toString());
}
}

答案 3 :(得分:1)

您可以这样做:

public static void main(String[] args) {
    String str = new String("PINEAPPLE");
    Set <Character> letters = new <Character>HashSet();

    for (int i = 0; i < str.length(); i++) {
        letters.add(str.charAt(i));
    }
    System.out.println(letters);
}

答案 4 :(得分:0)

我认为支持ASCII码的优化版本可以是这样的:

public static void main(String[] args) {
    System.out.println(removeDups("*PqQpa abbBBaaAAzzK zUyz112235KKIIppP!!QpP^^*Www5W38".toCharArray()));
}
public static String removeDups(char []input){
    long ocr1=0l,ocr2=0l,ocr3=0;
    int index=0;
    for(int i=0;i<input.length;i++){
        int val=input[i]-(char)0;
        long ocr=val<126?val<63?ocr1:ocr2:ocr3;
        if((ocr& (1l<<val))==0){//not duplicate
            input[index]=input[i];
            index++;
        }
        if(val<63)
            ocr1|=(1l<<val);
        else if(val<126)
            ocr2|=(1l<<val);
        else 
            ocr3|=(1l<<val);
    }
    return new String(input,0,index);
}

请记住,每个orc(s)代表一系列ASCII字符的映射,每个java long变量可以增长到(2 ^ 63),因为我们在ASCII中有128个字符所以我们需要三个ocr(s)基本上将字符的出现映射到一个长数字。

  • ocr1:(char)0到(char)62
  • ocr2:(char)63 to(char)125
  • ocr3:(char)126 to(char)128

现在如果找到了副本

(ocr& (1l<<val)) 

将大于零,我们跳过该char,最后我们可以创建一个索引大小的新字符串,该字符串显示最后一个非重复项索引。 如果需要,您可以定义更多orc(s)并支持其他字符集。

答案 5 :(得分:0)

可以使用HashSet和普通for循环:

public class RemoveDupliBuffer 
{
public static String checkDuplicateNoHash(String myStr)
{
    if(myStr == null)
        return null;
    if(myStr.length() <= 1)
        return myStr;

    char[] myStrChar = myStr.toCharArray();
    HashSet myHash = new HashSet(myStrChar.length);
    myStr = "";

    for(int i=0; i < myStrChar.length ; i++)
    {
        if(! myHash.add(myStrChar[i]))
        {

        }else{
            myStr += myStrChar[i];
        }
    }
    return myStr;
}

public static String checkDuplicateNo(String myStr) 
{
    // null check
    if (myStr == null)
        return null;
    if (myStr.length() <= 1)
        return myStr;

    char[] myChar = myStr.toCharArray();
    myStr = "";
    int tail = 0;
    int j = 0;

    for (int i = 0; i < myChar.length; i++) 
    {
        for (j = 0; j < tail; j++)
        {
            if (myChar[i] == myChar[j])
            {
                break;
            }
        }
        if (j == tail)
        {
            myStr += myChar[i];
            tail++;
        }
    }

    return myStr;
}

public static void main(String[] args) {
    String myStr = "This is your String";
    myStr = checkDuplicateNo(myStr);
    System.out.println(myStr);
}

答案 6 :(得分:0)

使用HashSet和ArrayList剪切字符串中的重复元素的另一个简单方法:

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Scanner;

public class sample_work {

    public static void main(String args[]) {

        String input = "";

        System.out.println("Enter string to remove duplicates: \t");
        Scanner in = new Scanner(System.in);
        input = in.next();
        in.close();

        ArrayList<Character> String_array = new ArrayList<Character>();
        for (char element : input.toCharArray()) {
            String_array.add(element);
        }

        HashSet<Character> charset = new HashSet<Character>();
        int array_len = String_array.size();
        System.out.println("\nLength of array = " + array_len);

        if (String_array != null && array_len > 0) {
            Iterator<Character> itr = String_array.iterator();
            while (itr.hasNext()) {
                Character c = (Character) itr.next();
                if (charset.add(c)) {

                } else {
                    itr.remove();
                    array_len--;
                }
            }
        }
        System.out.println("\nThe new string with no duplicates: \t");
        for (int i = 0; i < array_len; i++) {
            System.out.println(String_array.get(i).toString());
        }
    }

}

答案 7 :(得分:0)

你可以使用这个简单的代码,并了解如何从string中删除重复值。我认为这是理解这个问题的最简单方法。

类RemoveDup {

static int l;
public String dup(String str)
{

l=str.length();
System.out.println("length"+l);
char[] c=str.toCharArray();

for(int i=0;i<l;i++)
{

    for(int j=0;j<l;j++)
    {
        if(i!=j)
        {   
        if(c[i]==c[j])
        {
            l--;
            for(int k=j;k<l;k++)
            {
        c[k]=c[k+1];
            }
            j--;
        }
        }
    }


}

System.out.println("after concatination lenght:"+l);
StringBuilder sd=new StringBuilder();
for(int i=0;i<l;i++)
{
    sd.append(c[i]);

}
str=sd.toString();
return str;
}



public static void main(String[] ar)
{
RemoveDup obj=new RemoveDup();
Scanner sc=new Scanner(System.in);
String st,t;
System.out.println("enter name:");
st=sc.nextLine();
sc.close();
t=obj.dup(st);
System.out.println(t);
}

}

答案 8 :(得分:0)

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package javaapplication26;

import java.util.*;

/**
 *
 * @author THENNARASU
 */
public class JavaApplication26 {

    public static void main(String[] args) {


   int i,j,k=0,count=0,m;

    char a[]=new char[10];

       char b[]=new char[10]; 

    Scanner ob=new Scanner(System.in);

    String str;

    str=ob.next();

    a=str.toCharArray();

    int c=str.length();


    for(j=0;j<c;j++)

   {

        for(i=0;i<j;i++)

        {

            if(a[i]==a[j])

            {

                count=1;


            }

        }

         if(count==0)

        {

            b[k++]=a[i];

        }

        count=0;

    }

   for(m=0;b[m]!='\0';m++)

   {


System.out.println(b[m]);

        }

        }


    }

答案 9 :(得分:0)

我编写了这个程序。我正在使用2个char数组。您可以定义要从原始字符串中消除的重复字符数,还可以显示字符串中每个字符的出现次数。

 public String removeMultipleOcuranceOfChar(String string, int numberOfChars){
     char[] word1 = string.toCharArray();
     char[] word2 = string.toCharArray();
     int count=0;         
     StringBuilder builderNoDups = new StringBuilder();
     StringBuilder builderDups = new StringBuilder();

     for(char x: word1){             
         for(char y : word2){
             if (x==y){
                 count++;
             }//end if                  
         }//end inner loop            
         System.out.println(x + " occurance: " + count );
         if (count ==numberOfChars){
             builderNoDups.append(x);                 
         }else{
             builderDups.append(x);
         }//end if else
         count = 0;             
     }//end outer loop
     return String.format("Number of identical chars to be in or out of input string: "
             + "%d\nOriginal word: %s\nWith only %d identical chars: %s\n"
             + "without %d identical chars: %s",
             numberOfChars,string,numberOfChars, builderNoDups.toString(),numberOfChars,builderDups.toString());
}

答案 10 :(得分:0)

尝试使用这种简单的解决方案,以从给定的字符串中删除重复的字符/字母

 "dependencies": {
"@feathersjs/authentication": "^2.1.6",
"@feathersjs/authentication-jwt": "^2.0.1",
"@feathersjs/authentication-local": "^1.2.1",
"@feathersjs/configuration": "^1.0.2",
"@feathersjs/errors": "^3.3.0",
"@feathersjs/express": "^1.2.2",
"@feathersjs/feathers": "^3.1.5",
"compression": "^1.7.2",
"cors": "^2.8.4",
"feathers-mongodb": "^3.1.0",
"feathers-mongoose": "^6.1.1",
"helmet": "^3.12.0",
"mongodb": "^3.1.0-beta4",
"mongoose": "^5.0.18",
"serve-favicon": "^2.5.0",
"winston": "^2.4.2"

答案 11 :(得分:0)

在Java 8中,我们可以使用

private void removeduplicatecharactersfromstring() {
    String myString = "aabcd eeffff ghjkjkl";
    StringBuilder builder = new StringBuilder();
    Arrays.asList(myString.split(" "))
            .forEach(s -> {
                builder.append(Stream.of(s.split(""))
                        .distinct().collect(Collectors.joining()).concat(" "));
            });
    System.out.println(builder); // abcd ef ghjkl
}