Java 从ArrayList中删除重复项的算法

Java 从ArrayList中删除重复项的算法,java,arrays,arraylist,duplicates,Java,Arrays,Arraylist,Duplicates,我有一个ArrayList,其中包含以下内容: for (int m = 0; m < (size-1); m++){ for (int j = m + 1; j < size; j++){ if (ArrayList.get(j).charAt(0) != ArrayList.get(m).charAt(0)){ continue; } current++;

我有一个
ArrayList
,其中包含以下内容:

for (int m = 0; m < (size-1); m++){
        for (int j = m + 1; j < size; j++){
            if (ArrayList.get(j).charAt(0) != ArrayList.get(m).charAt(0)){
                continue;
            }
            current++;
            ArrayList.remove(j).charAt(0);
            j--;
            size--;
        }
    }
2#31#0

1#04#1

9250

4#23#2

1#12#1

输出:6个不同的数字

我正在尝试编写一个算法,删除高亮显示的数字的重复项,这样我就可以使用计数器查看所有这些位置中总共有多少不同的数字

我尝试了很多方法,包括以下几种:[Java使用循环从数组中删除重复项][1],[Java-在ArrayList中删除重复项][2],[How to find duplicates in Java array?][3]中的第一个选项,以及更多。我花了至少5-10个小时试图找出我做错了什么,但我做不到,所以我求助于你

大多数时候,我在网上找到的解决方案似乎只适用于简单的东西,但在我的情况下就不行了。在它中,当我试图打印不同的字符时,它总是返回错误的
int
数字

我也尝试过,也尝试过将每一行数字分成不同的
int数组[]
,然后进行比较,但它无法捕获所有不同的值

在另一个例子中,我总共有5个不同的数字,结果总是得到“4个不同的”,所以我甚至尝试了
long n=ArrayList.stream().distinct().count()只是想看看我是否做错了什么,但即使这个东西也返回了“4个不同”的数字

我知道最简单的方法是使用
Set
Map
,但我不想这样。我想要一个算法

编辑:

我尝试过的许多事情之一是:

for (int m = 0; m < (size-1); m++){
        for (int j = m + 1; j < size; j++){
            if (ArrayList.get(j).charAt(0) != ArrayList.get(m).charAt(0)){
                continue;
            }
            current++;
            ArrayList.remove(j).charAt(0);
            j--;
            size--;
        }
    }
编辑3: 我已经找到了一个可能的解决方案,但它给了我一个IndexOutOfBoundsException。 我已经将数字2,1,9,4,1放入
Array1
中,将1,4,5,3,2放入
Array2
中,但是当我尝试比较它们时,我得到了提到的错误

boolean stopSequence = false;
    for (int i = 0; i < Array1.length; i++){
        for (int a = 0; a < Array2.length && !stopSequence;){
            if (Array1[i] != Array2[a]){
                Array1[i] = 0;
                a++;
            }
            if (Array1[i] == Array2[a]){
                Array1[i] = 0;
                stopSequence = true;
            }
        }
        stopSequence = false;
    }

[1]: https://stackoverflow.com/questions/26998156/java-remove-duplicates-from-array-using-loops
[2]: https://stackoverflow.com/questions/2435156/java-removing-duplicates-in-an-arraylist
[3]: http://javarevisited.blogspot.com.es/2015/06/3-ways-to-find-duplicate-elements-in-array-java.html
[4]: https://stackoverflo
boolean stopSequence=false;
for(int i=0;i

w、 com/questions/203984/how-do-i-remove-repeated-elements-from-arraylist?rq=1

好吧,一个好的做法总是将问题分成更小的部分

6 different numbers
例如,一个好的设计应该是包含以下成员的类:

  • 数字
    :这是整数数组的一个实例变量,包含每个数字重复的次数。它必须预先调整到允许的最大数字(我猜是9
  • differentidGits
    :是一个实例变量,包含不同位数
  • processList
    :此方法应接收列表以浏览它,并为每个项目调用
    processItem
  • processItem
    :此方法应接收项目字符串,并根据指定格式(例如,通过
    StringTokenizer
    )解析数字,并为每个所需数字调用
    storeDigit
  • storeDigit
    :此方法应接收一个int,并使用它索引实例数组
    digits
    ,并增加索引位置。如果索引位置为0,则还应增加
    differentidGits

算法比您想象的要简单得多:

  • 将每个字符串转换为一对字符
  • 将所有字符放入删除重复字符的集合或流中
  • 计算字符数
  • 下面是一个完整的示例:

    import java.util.Arrays;
    import java.util.List;
    import java.util.stream.IntStream;
    
    public class Duplicates {
        public static void main(String[] args) {
            List<String> list = Arrays.asList("2#3#1#0",
                                              "1#0#4#1",
                                              "9#2#5#0",
                                              "4#2#3#2",
                                              "1#1#2#1");
            System.out.println(
                list.stream()
                    .flatMapToInt(s -> IntStream.of(s.charAt(0), s.charAt(4)))
                    .distinct()
                    .count());
        }
    }
    
    导入java.util.array;
    导入java.util.List;
    导入java.util.stream.IntStream;
    公共类副本{
    公共静态void main(字符串[]args){
    List List=Arrays.asList(“2#3#1#0”,
    "1#0#4#1",
    "9#2#5#0",
    "4#2#3#2",
    "1#1#2#1");
    System.out.println(
    list.stream()
    .flatMapToInt(s->IntStream.of(s.charAt(0),s.charAt(4)))
    .distinct()
    .count());
    }
    }
    
    编辑:您似乎想要遵守荒谬的限制,因此既不使用流也不使用集合,因为它们完全有意义。下面的代码仅使用列表,但基本上与上面的操作相同,但效率要低得多:

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    public class Duplicates {
        public static void main(String[] args) {
            List<String> list = Arrays.asList("2#3#1#0",
                                              "1#0#4#1",
                                              "9#2#5#0",
                                              "4#2#3#2",
                                              "1#1#2#1");
            List<Character> uniqueChars = new ArrayList<>();
            for (String s : list) {
                Character c0 = s.charAt(0);
                Character c4 = s.charAt(4);
    
                if (!uniqueChars.contains(c0)) {
                    uniqueChars.add(c0);
                }
                if (!uniqueChars.contains(c4)) {
                    uniqueChars.add(c4);
                }
            }
    
            System.out.println(uniqueChars.size());
        }
    }
    
    import java.util.ArrayList;
    导入java.util.array;
    导入java.util.List;
    公共类副本{
    公共静态void main(字符串[]args){
    List List=Arrays.asList(“2#3#1#0”,
    "1#0#4#1",
    "9#2#5#0",
    "4#2#3#2",
    "1#1#2#1");
    List uniqueChars=new ArrayList();
    用于(字符串s:列表){
    字符c0=s.charAt(0);
    字符c4=s.charAt(4);
    如果(!uniqueChars.contains(c0)){
    唯一字符添加(c0);
    }
    如果(!uniqueChars.包含(c4)){
    唯一字符添加(c4);
    }
    }
    
    6
    
    1000111110
    
           ArrayList<String> numlist=new ArrayList<String>();
           int freq[] = new int [10];
           numlist.add("2#3#1#0");
           numlist.add("1#0#4#1");
           numlist.add("9#2#5#0");
           numlist.add("4#2#3#2");
           numlist.add("1#1#2#1");
           for(int i = 0; i < numlist.size(); i++){
               String row = numlist.get(i);          
               int numValue1 = Character.getNumericValue(row.charAt(0));
               int numValue2 = Character.getNumericValue(row.charAt(4));
               freq[numValue1]++;
               freq[numValue2]++;          
           }
           int count = 0;
           for(int i = 0; i < 10; i++){
               if(freq[i] > 0){
                   count++;
               }
           }
           System.out.println(count + " different numbers");
    
    6 different numbers