0

在我的程序中,用户输入一个字符串,它首先找到字符串中字符的最大模式。接下来,我的程序应该删除字符串中一个字符的所有重复项(用户输入: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();


}

}
4

13 回答 13

3

试试这个方法……应该可以的!

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;
}
于 2013-12-12T19:20:52.463 回答
1

欢迎来到 StackOverflow!

您正在调用getMode()outside 和 inside of removeDup(),这就是它打印两次的原因。

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

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

快乐编码!

于 2013-10-24T23:22:43.870 回答
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());
}
}
于 2017-01-09T03:06:54.310 回答
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);
}
于 2019-03-25T12:24:40.740 回答
0

试试这个简单的答案 - 适用于作为用户输入接受的简单字符串:

导入 java.util.Scanner;

公共类 string_duplicate_char {

String final_string = "";

public void inputString() {

    //accept string input from user
    Scanner user_input = new Scanner(System.in);
    System.out.println("Enter a String to remove duplicate Characters : \t");
    String input = user_input.next();
    user_input.close();

    //convert string to char array
    char[] StringArray = input.toCharArray();
    int StringArray_length = StringArray.length;

    if (StringArray_length < 2) {
        System.out.println("\nThe string with no duplicates is: "
                + StringArray[1] + "\n");
    } else {
        //iterate over all elements in the array
        for (int i = 0; i < StringArray_length; i++) {

            for (int j = i + 1; j < StringArray_length; j++) {

                if (StringArray[i] == StringArray[j]) {
                    int temp = j;//set duplicate element index

                    //delete the duplicate element by copying the adjacent elements by one place
                    for (int k = temp; k < StringArray_length - 1; k++) {
                        StringArray[k] = StringArray[k + 1];
                    }
                    j++;
                    StringArray_length--;//reduce char array length

                }
            }

        }

    }

    System.out.println("\nThe string with no duplicates is: \t");

    //print the resultant string with no duplicates
    for (int x = 0; x < StringArray_length; x++) {

        String temp= new StringBuilder().append(StringArray[x]).toString();
        final_string=final_string+temp;
    }
    System.out.println(final_string);

}

public static void main(String args[]) {

    string_duplicate_char object = new string_duplicate_char();
    object.inputString();

}

}

于 2015-04-29T19:03:04.217 回答
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());
        }
    }

}
于 2015-04-30T12:48:34.130 回答
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);
}
于 2015-03-07T23:36:00.687 回答
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),因为我们有 128 个 ASCII 字符,所以我们需要三个 ocr(s ) 基本上将字符的出现映射到一个长数字。

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

现在,如果发现重复

(ocr& (1l<<val)) 

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

于 2014-08-01T02:56:32.950 回答
0

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

类 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);
}

}

于 2015-05-05T19:21:41.327 回答
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
}
于 2020-10-05T19:34:36.460 回答
0

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

 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());
}
于 2017-01-26T04:34:09.980 回答
0

试试这个简单的解决方案来删除给定字符串中的重复字符/字母

import java.util.Scanner;

public class RemoveDuplicateLetters {

public static void main(String[] args) {

    Scanner scn=new Scanner(System.in);
    System.out.println("enter a String:");
    String s=scn.nextLine();
    String ans="";

           while(s.length()>0)
        {
           char ch = s.charAt(0);
            ans+= ch;
            s = s.replace(ch+"",""); //Replacing all occurrence of the current character by a spaces
        }
    System.out.println("after removing all duplicate letters:"+ans);
    }
  }
于 2018-08-12T06:48:04.540 回答
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]);

        }

        }


    }
于 2015-10-30T05:57:13.410 回答