天道酬勤,学无止境

Java Method for removing duplicates from char array

I have a char array filled by the user (arrayInput[]) with some characters, like {b, d, a, b, f, a, g, a, a, f}, and I need to create a method which returns a new char array with only the first occurrence of the character, but in the order of input. The book also says "A way to solve this problem is to create a boolean array to keep track of the characters to mantain!", but I can't imagine how the boolean array should work with the other arrays.

The main problem is that I can save in a boolean array if arrayInput contains a specific character, and even how many times, but only creating a very long ramified if-else into a for, like

    if ((arrayOutput[i] == 'A') && (arrayControl[0] = false)) {
        arrayControl[0] = true;  }

where arrayOutput is the array I want to return from the method, arrayControl[0] is the value of 'A' in my boolean array I created into the method. A = 0, B = 1, ... Z = 25, a = 26, b = 27, ... 51 = z. For every single character, uppercase and lowercase, I created a place into the array, so I could check everything, but now I can't go any further. I don't know how to save the characters on arrayOutput, how to check if a character is already on arrayOutput and if it's already there, the array passes that specific character and go to the next one.

Also please remember I'm a newbie, so I know very little about Java. Please explain yourself the best you can. Thanks in advance!

评论

This could work:

public static void main(String[] args) {
    Main main = new Main();
    char[] array = {'e','a','b','a','c','d','b','d','c','e'};
    main.getCharArray(array);
}

private char[] getCharArray(char[] array) {
    String _array = "";
    for(int i = 0; i < array.length; i++) {
        if(_array.indexOf(array[i]) == -1) // check if a char already exist, if not exist then return -1
            _array = _array+array[i];      // add new char
    }
    return _array.toCharArray();
}

Output:

eabcd

 boolean arr[26]; //considering only small letters arrive. otherwise take a larger array.
for( i=0;i<str.length;i++ )
  arr[str[i]-'a']=true;

The ones at last after the loop are true are the actual character. (all duplicates eleminated).

To take into consideration the positions,

int arr[26];
  //initialize all the array elemnts to 0
  for( i=0;i<str.length();i++ )
      if(i>=arr[str[i]-'a'])
            arr[str[i]-'a']=i+1;

//Those greater than 0 are non-duplicated characters. Their poistion of first occurence= (arr[i]-1)

EDIT: I have last used java almost a year ago. The algorithm is shown properly. Sorry for my awkward java code.

This might help. Make a separate array and store only non-duplicate characters.

char[] removeDuplicates (char[] arrayInput) {
    boolean exists[]=new boolean[26];
    char arrayOutput[] = new char[26];
    int ctr=0;
    for(int i=0; i<26; i++) {
        exists[i] = false;
    }
    for(int i=0; i<arrayInput.length; i++) {
        if(!exists[arrayInput[i]-97]) {
            exists[arrayInput[i]-97]=true;
            arrayOutput[ctr++]=arrayInput[i];
        }
    }

   return Arrays.copyOfRange(arrayOutput, 0, ctr);

}

If you consider using of collection framework then it would be much easier. Your array of char with duplicate is arrayInput. Now put each char from it to a HashSet like this -

HashSet<Character> uniqueCharSet = new HashSet<Character>();
for(char each : arrayInput){

   uniqueCharSet.add(each);
}   

Now the HashSet uniqueCharSet will contains only the unique characters from the char array arrayInput. Note here all element in uniqueCharSet are wrapper type - Character.

You can convert the HashSet uniqueCharSet to array of Character like this -

Object[] uniqueCharArray = uniqueCharSet.toArray();

And then you can use them like this -

for(Object each : uniqueCharArray){
   Character c = (Character) each;
   System.out.println(c);
}

Here's the method to achieve what you need:

public static void main(String[] args) {
    char[] arr= {'A','B','C','A','B'};

    HashSet<Character> hset=new HashSet<Character>();

    for(int i=0;i<arr.length;i++) {
        hset.add(arr[i]);
        }

    Object[] ObjChar=hset.toArray();

    char[] resultArr = new char[ObjChar.length];

    for(int j=0;j<ObjChar.length;j++) {

    resultArr[j]=(char) ObjChar[j];
    }

    for(char eachChar: resultArr) {

        System.out.println(eachChar);
    }
}

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 删除字符串中重复字符的功能(function to remove duplicate characters in a string)
    问题 以下代码试图删除字符串中所有重复的字符。 我不确定代码是否正确。 有人可以帮助我处理代码吗(即,字符匹配时实际发生了什么)? public static void removeDuplicates(char[] str) { if (str == null) return; int len = str.length; if (len < 2) return; int tail = 1; for (int i = 1; i < len; ++i) { int j; for (j = 0; j < tail; ++j) { if (str[i] == str[j]) break; } if (j == tail) { str[tail] = str[i]; ++tail; } } str[tail] = 0; } 回答1 该功能对我来说很好。 我已经写了内联评论。 希望能帮助到你: // function takes a char array as input. // modifies it to remove duplicates and adds a 0 to mark the end // of the unique chars in the array. public static void removeDuplicates(char[] str) { if (str =
  • 从数组中删除元素(Java)[重复](Removing an element from an Array (Java) [duplicate])
    问题 这个问题已经在这里有了答案: 如何从Java中的数组中删除对象? (21个回答) 7年前关闭。 有什么快速(好看的)方法可以从Java中的数组中删除元素? 回答1 您可以使用common lang的ArrayUtils。 array = ArrayUtils.removeElement(array, element) commons.apache.org库:Javadocs 回答2 您的问题不是很清楚。 从您自己的答案中,我可以更好地告诉您您正在尝试做什么: public static String[] removeElements(String[] input, String deleteMe) { List result = new LinkedList(); for(String item : input) if(!deleteMe.equals(item)) result.add(item); return result.toArray(input); } 注意:这未经测试。 错误检查留给读者练习(如果input或deleteMe为null,则抛出IllegalArgumentException;在null列表输入上的空列表没有意义。从数组中删除null字符串可能是有道理的,但是我也会将其保留为练习;当前,如果deleteMe为null
  • 如何修剪字符串中的空格? [复制](How to trim the whitespace from a string? [duplicate])
    问题 这个问题已经在这里有了答案: 从Java字符串中去除前导和尾随空格(7个答案) 2年前关闭。 我正在为J2ME应用程序编写此函数,因此我没有一些更高级/更现代的Java类可供使用。 我正在此上获取java.lang.ArrayIndexOutOfBoundsException 。 因此,显然要么它不喜欢我初始化newChars数组的方式,要么在调用System.arraycopy时我没有正确执行某些操作。 /* * remove any leading and trailing spaces */ public static String trim(String str) { char[] chars = str.toCharArray(); int len = chars.length; // leading while ( (len > 0 ) && ( chars[0] == ' ' ) ) { char[] newChars = new char[] {}; // initialize empty array System.arraycopy(chars, 1, newChars, 0, len - 1); chars = newChars; len = chars.length; } // TODO: trailing return chars.toString()
  • Java 8的字符串重复数据删除功能(String Deduplication feature of Java 8)
    问题 由于Java中的String (与其他语言一样)会消耗大量内存,因为每个字符都占用两个字节,因此Java 8引入了一项名为String Deduplication的新功能,该功能利用了char数组在string和final内部的事实, JVM可以将它们弄乱。 到目前为止,我已经阅读了这个示例,但是由于我不是专业的Java程序员,因此我很难理解这个概念。 它是这样说的, 已经考虑了多种用于字符串复制的策略,但是现在实现的策略遵循以下方法:每当垃圾收集器访问String对象时,它都会记录char数组。 它获取其哈希值,并将其与对数组的弱引用一起存储。 一旦找到另一个具有相同哈希码的字符串,便将其逐个字符地进行比较。 如果它们也匹配,则将修改一个String并指向第二个String的char数组。 然后,第一个char数组不再被引用,可以被垃圾回收。 这整个过程当然会带来一些开销,但受到严格的限制。 例如,如果在一段时间内未发现字符串重复,则将不再检查该字符串。 我的第一个问题 由于该主题是最近在Java 8 update 20中添加的,因此仍然缺少有关该主题的资源,在这里的任何人都可以分享一些有关如何帮助减少Java中String占用的内存的实际示例吗? 编辑: 上面的链接说, 一旦找到另一个具有相同哈希码的字符串,便将它们逐个字符地进行比较 我的第二个问题
  • 类型不匹配,无法从 void 转换为 char[] [重复](Type mismatch, cannot convert from void to char[] [duplicate])
    问题 这个问题在这里已经有了答案: “不兼容的类型:void 不能转换为……”是什么意思? (1 个回答) 2年前关闭。 我正在测试 2 个字符串是否是字谜。 我想如果我把它们做成数组然后对它们进行排序,结果它们是相等的,它们就是字谜。 但是,我遇到了类型不匹配编译器错误,我不知道为什么。 package local.random; import java.util.Arrays; public class Anagram { public static void main(String[] args) { String s1 = "go hang a salami"; String s2 = "im a lasagna hog"; System.out.println(s1); System.out.println(s2); System.out.println(IsAnagram(s1,s2)); } public static boolean IsAnagram (String s1, String s2) { char[] s1Char = s1.toCharArray(); char[] s2Char = s2.toCharArray(); char[] s1Sorted = Arrays.sort(s1Char);//Type mismatch: cannot
  • JAVA学习笔记——HashSet和TreeSet和Map
    知识回顾 集合 Collection Map 以value形式存储 以key-value形式存储 List Queue Set 有序可重复 无序无重复 key无序无重复value无序可重复 *ArrayList HashSet HashMap Vector TreeSet TreeMap Stack(LIFO) *LinkedList add() add() remove() remove() set() get() iterator() size() size() 1.集合的应用 集合就是一个小容器 增删改查 2.集合使用的情形 各自集合的特点 3.底层原理 数据结构的存储方式 4.自己尝试实现 ======================================================= Collection 以value形式存在 Set 无序无重复 1.具体的实现类 HashSet TreeSet 2.基本的使用 3.无序 无重复 无序:我们使用集合存放元素的顺序 集合内取出来的顺序不一致 集合本身是有自己的算法排布顺序 hash算法 HashSet---->(HashMap (数组+链表) 散列表 临接连表) 1.java.util 2.如何创建对象 无参数 有参数 3.集合容器的基本使用 增删改查 boolean = add(value) addAll
  • 在Java中打印char和int数组之间的区别(Difference between printing char and int arrays in Java [duplicate])
    问题 这个问题已经在这里有了答案: 如果char数组是Java中的Object,为什么打印它不会显示其哈希码? (6个答案) 3年前关闭。 当我运行以下代码时,我得到了数组的地址: int arr[] = {2,5,3}; System.out.println(arr); // [I@3fe993 但是,当我声明一个字符数组并以相同的方式打印它时,它将为我提供数组的实际内容。 为什么? char ch[] = {'a','b','c'}; System.out.println(ch); // abc 回答1 类PrintStream (这是System.out的类)具有专用的方法重载println(char []),该方法可打印char数组的字符。 它对其他数组没有特殊的重载,因此当您传递int[] ,调用的方法是println(Object)。 该方法通过调用传递的对象的toString()方法将其转换为字符串。 所有数组的toString()方法只是从Object类继承的默认方法,该方法显示它们的类名和默认哈希码,这就是为什么它不那么有用的原因。 您可以使用Arrays.toString(int [])来获取int数组内容的字符串表示形式。 PS与文档相反,对象的默认哈希码通常不是对象的地址,而是随机生成的数字。 回答2 当你说System.out.println(ch)
  • 在C中删除数组中的重复项(Removing Duplicates in an array in C)
    问题 问题有点复杂。 这里的问题是摆脱重复并将数组的唯一元素以其原始序列保存到另一个数组中。 例如 : 如果输入的是bacadt 结果应该是: bacdt 处于输入输入的确切状态。 因此,为了对数组进行排序,然后检查无法工作,因为我丢失了原始序列。 有人建议我使用索引数组,但我不知道该怎么做。 那么你有什么建议呢? 对于那些愿意回答这个问题的人,我想补充一些具体信息。 char** finduni(char *words[100],int limit) { // //Methods here // } 是我的功能。 应删除重复项并将其存储在不同数组中的数组是 words[100]。 因此,流程将在此基础上完成。 我首先考虑将单词的所有元素放入另一个数组并对该数组进行排序,但这在一些测试后不起作用。 只是对求解者的提醒:)。 回答1 好吧,这是一个char类型的版本。 请注意,它不会缩放。 #include "stdio.h" #include "string.h" void removeDuplicates(unsigned char *string) { unsigned char allCharacters [256] = { 0 }; int lookAt; int writeTo = 0; for(lookAt = 0; lookAt < strlen(string)
  • 在函数调用的参数内定义新函数、数组、结构等 [重复](Define new function, array, struct etc inside of parameter of function call [duplicate])
    问题 这个问题在这里已经有了答案: 如何在不使用变量 C/C++ 的情况下将常量数组文字传递给采用指针的函数? (9 个回答) 4年前关闭。 如果您有一个采用以下内容的函数: void foo(char **arr); 你怎么能做到以下几点: void foo(char* x[] = { "hello", "my", "friend" }); 如果这让您感到困惑,在 Java 中,我们通过以下方式执行此操作: public void foo(String[] x); foo(new String[] { "hello", "my", "friend" }); 目前,我在 C 中做了以下我讨厌的事情,因为它看起来真的很难看: char* myArr[] = { "hello", "my", "friend" }; foo(myArr); 回答1 你怎么能做到以下几点: void foo(char* x[] = { "hello", "my", "friend" }); 你几乎成功了...... ;-) 如果使用 C99 或更新版本,请使用如下复合文字: foo((char *[]){"hello", "my", "friend"}); 请注意,被调用的函数(此处的foo() )不知道指针数组有多少个元素,因此您想添加一个最终的空指针作为哨兵: foo((char *[]){
  • 如何从C#数组中删除重复项?(How do I remove duplicates from a C# array?)
    问题 我一直在使用C#中的string[]数组,该数组从函数调用中返回。 我可能会转换为Generic集合,但是我想知道是否有更好的方法可以做到这一点,可能是使用临时数组。 从C#数组中删除重复项的最佳方法是什么? 回答1 您可以使用LINQ查询来执行此操作: int[] s = { 1, 2, 3, 3, 4}; int[] q = s.Distinct().ToArray(); 回答2 这是HashSet <string>方法: public static string[] RemoveDuplicates(string[] s) { HashSet<string> set = new HashSet<string>(s); string[] result = new string[set.Count]; set.CopyTo(result); return result; } 不幸的是,此解决方案还需要.NET Framework 3.5或更高版本,因为直到该版本才添加HashSet。 您也可以使用array.Distinct(),这是LINQ的功能。 回答3 如果您需要对它进行排序,则可以实施一种排序,该操作还可以删除重复项。 然后用一块石头杀死两只鸟。 回答4 以下经过测试和有效的代码将从数组中删除重复项。 您必须包括System.Collections命名空间。
  • 2021年3月31日华为笔试
    模板 /华为考试万用模板/ import java.io.*; import java.util.*; public class Main{ public static void main(String args[])throws IOException{ BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); String str=br.readLine(); String str2; while((str2=br.readLine())!=null){ StringBuilder sb=new StringBuilder(); sb.append(); } } } 第一道题 :字符串最后一个单词的长度 public static void main(String[] args){ Scanner sc=new Scanner(System.in); String str=sc.nextLine(); String[] s=str.split("\\s+");这一句很重要!!!!!!!!! int length=s[s.length-1].length(); System.out.println(length); } 第二题:计算字符的个数,接收String类型字符串,由各种字符组成
  • 蓝桥杯试题 算法提高 11-2删除重复元素 JAVA
    试题 算法提高 11-2删除重复元素 资源限制 时间限制:10.0s 内存限制:256.0MB 问题描述   为库设计新函数DelPack,删除输入字符串中所有的重复元素。不连续的重复元素也要删除。   要求写成函数,函数内部使用指针操作。 样例输入 1223445667889 样例输出 13579 样例输入 else 样例输出 ls 数据规模和约定   字符串数组最大长度为100。 思路:这道题原本想用校门外的数一样的思路,发现存储的方式不一样,思考了一下发现可以用结构体来解决这道题,用结构体存储了这个字符串的字符之后可以保存起来,第二次发现这个字符可以直接定义一个整形变量来递增就不用重新存储了,全部检查完成之后,把只出现过一次的字符输出即可。 代码如下: import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); String s = sc.next(); int t=0;boolean bool=true; stu[] a= new stu[s.length()]; char[] c = new char[s.length()]; for(int i=0;i<s.length();i++) {
  • Java ArrayList 删除对象 - IndexOutOfBoundsException(Java ArrayList remove object - IndexOutOfBoundsException)
    问题 我试图从 ArrayList 中删除一个对象,但我不断收到 IndexOutOfBounds 错误。 现在有很多可用的信息,为什么在删除ArrayList 的同时迭代会发生这种情况,但是我没有这样做。 例子: ArrayList<Character> a = new ArrayList<Character>(); a.add('A'); a.add('B'); a.add('C'); System.out.println(a); a.remove('A'); System.out.println(a); 打印[A, B, C]然后失败: java.lang.IndexOutOfBoundsException: Index: 65, Size: 3 at java.util.ArrayList.rangeCheck(ArrayList.java:635) at java.util.ArrayList.remove(ArrayList.java:474) at b.<init>(b.java:23) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance
  • 如何在不使用 StringBuilder 的情况下从字符串(不是数组)中删除重复项?(How to remove duplicates from string (not array) without using StringBuilder?)
    问题 我正在使用我的程序,我需要从用户给我的字符串中删除重复的字符。 我参考了其他问题,但他们都使用StringBuilder来删除重复项。 但是,有没有办法使用StringBuilder和Set在不将字符串转换为数组的情况下删除重复项? 我还没有学过这些,所以我不太了解它们。 我能得到一些帮助吗? 例如,如果用户输入happyrolling结果应该是hapyroling 。 回答1 从您的示例看来,您想删除重复的字符(不是words )。 您可以使用正则表达式来查找重复并删除它们: str = str.replaceAll("(.)\\1+", "$1"); 此正则表达式捕获每个字符,但仅在使用对捕获组的反向引用后跟相同字符时才匹配。 替换是捕获的字符,因此例如“xx”替换为“x” 回答2 不知何故,您需要将字符串转换为字符数组。 String 在 Java 中是不可变的,所以如果你想在 String 中做任何类型的操作,要么你必须把它转换成 charArray,要么你必须使用 StringBuilder 来创建新的 String。 您可以使用 hashmap 跟踪使用的字符。 public String removeDuplicates(String str){ char[] array = str.toCharArray(); char ch; int k = 0
  • 在Java中从字符串中删除重复项(Removing duplicates from a String in Java)
    问题 我正在尝试遍历字符串,以删除重复的字符。 例如,字符串aabbccdef应该变成abcdef ,而字符串abcdabcd应该变成abcd 这是我到目前为止的内容: public class test { public static void main(String[] args) { String input = new String("abbc"); String output = new String(); for (int i = 0; i < input.length(); i++) { for (int j = 0; j < output.length(); j++) { if (input.charAt(i) != output.charAt(j)) { output = output + input.charAt(i); } } } System.out.println(output); } } 做这个的最好方式是什么? 回答1 将字符串转换为char数组,并将其存储在LinkedHashSet 。 这样可以保留您的订购,并删除重复的商品。 就像是: String string = "aabbccdefatafaz"; char[] chars = string.toCharArray(); Set<Character> charSet = new
  • 如何去除list中的重复元素
    在实际开发的时候,我们经常会碰到这么一个困难:一个集合容器里面有很多重复的对象,里面的对象没有主键,但是根据业务的需求,实际上我们需要根据条件筛选出没有重复的对象。 比较暴力的方法,就是根据业务需求,通过两层循环来进行判断,没有重复的元素就加入到新集合中,新集合中已经有的元素就跳过。 操作例子如下,创建一个实体对象PenBean,代码如下: /** * 笔实体 */ public class PenBean { /**类型*/ private String type; /**颜色*/ private String color; //... 省略 setter 和 getter public PenBean(String type, String color) { this.type = type; this.color = color; } @Override public String toString() { return "PenBean{" + "type='" + type + '\'' + ", color='" + color + '\'' + '}'; } } 测试 demo,如下: public static void main(String[] args) { //添加信息,PenBean中没有主键 List<PenBean> penBeanList = new
  • 编写一种方法来删除 Java 字符串中的元音 [重复](Writing a method to remove vowels in a Java String [duplicate])
    问题 这个问题在这里已经有了答案: 如何比较 Java 中的字符串? (23 个回答) 7年前关闭。 我是编程初学者,正在编写 Java 方法来删​​除字符串中的元音,但我不知道如何解决此错误: ";" expected ";" expected : public String disemvowel(String s) { boolean isVowel(char c); if (c == 'a') { return true; } else if if (c == 'e') { return true; } else if if (c == 'i') { return true; } else if if (c == 'o') { return true; } else if if (c == 'u') { return true; } String notVowel = ""; int l = s.length(); for (int z = 0; z <= l; z++) { if (isVowel == "false") { char x = s.charAt(z); notVowel = notVowel + x; } } return notVowel; } 回答1 String str= "Your String"; str= str.replaceAll("
  • Java char Array - 删除元素(Java char Array - deleting elements)
    问题 在 Java 中,我想从 char 数组中删除某些元素,因此它会执行以下操作: char[] Array1 = {'h','m','l','e','l','l'}; Array1 = //character index[2] to character index[5] 如何才能做到这一点? 回答1 在 Java 中,您不能从数组中删除元素。 但你可以: 创建一个新的char[]只复制你想保留的元素; 为此,您可以使用 System.arraycopy() 甚至更简单的Arrays.copyOfRange()。 例如,仅复制数组的前三个字符: char[] array1 = {'h','m','l','e','l','l'}; char[] array2 = Arrays.copyOfRange(array1, 0, 3); 或者使用List<Character> ,它允许您获取包含一系列元素的子列表: List<Character> list1 = Arrays.asList('h','m','l','e','l','l'); List<Character> list2 = list1.subList(0, 3); 回答2 从字符数组中删除字符的 Java 函数: String msg = "johnny can't program, he can only be told
  • 如何创建一个包含 n 个字符的字符串? 如何创建具有特定长度的字符串? [复制](How to create a string with n characters? How to create a string with specific length? [duplicate])
    问题 这个问题在这里已经有了答案: 重复字符串 - Javascript (30 个回答) 6年前关闭。 我正在编写 JavaScript 单元测试,我需要创建一个长度为 65536 的字符串。在 JavaScript 中执行此操作的最佳方法是什么? 目前我正在使用: var myString = ''; for (var i = 0; i <= 65535; ++i) { myString += 'x'; } 回答1 怎么样 Array(65537).join('x') 请注意,它是 65537,而不是 65536,因为您将字符放在它们之间。 回答2 这是一个前瞻性的答案,在当前的实现中不起作用。 ECMAScript 6 目前正在定义一个String.prototype.repeat方法。 这将允许您执行以下操作: var result = "x".repeat(65535); 同样,这是未来的补充。 目前 ECMAScript 6 (Harmony) 正在起草中,从技术上讲,这可能会被删除,尽管看起来不太可能。 当前草稿: 15.5.4.21 String.prototype.repeat(计数) 采取以下步骤: 让O成为CheckObjectCoercible(this value) 。 让S成为ToString(O) 。 ReturnIfAbrupt(S) 。
  • 从未排序的链接列表中删除重复项(Remove duplicates from an unsorted linked list)
    问题 import java.util.*; /* * Remove duplicates from an unsorted linked list */ public class LinkedListNode { public int data; public LinkedListNode next; public LinkedListNode(int data) { this.data = data; } } public class Task { public static void deleteDups(LinkedListNode head){ Hashtable<Integer, Boolean> table=new Hashtable<Integer, Boolean>(); LinkedListNode previous=null; //nth node is not null while(head!=null){ //have duplicate if(table.containsKey(head.data)){ //skip duplicate previous.next=head.next; }else{ //put the element into hashtable table.put(head.data,true); //move to the next