关于java字符串去重的问题

问题描述

关于java字符串去重的问题

今天碰到个java字符串去重的问题,尝试着用另一种方法TreeSet去做一下,出来的结果确实去重了,但是会按abcd的顺序排列,而不是给定的字符串顺序。问一下怎么纠正?
public void Method_2(String str) {
// 原始输入
System.out.println("原始的字符串:" + str);
long startTime = System.nanoTime();
// 将输入转为字符串数组
String[] array = str.split("");
// 将数组转为TreeSet
Set set = new TreeSet(Arrays.asList(array));
Iterator iterator = set.iterator();
// 遍历TreeSet并输出
System.out.print("去重的字符串:");
while (iterator.hasNext()) {
String result = iterator.next();
System.out.print(result);
}
System.out.println();
// 计算程序运行时间
long endTime = System.nanoTime();
long time = endTime - startTime;
System.out.println("程序执行时间:" + time);
}

解决方案

这样去重从效率上讲,是低的,因为TreeSet是用TreeMap来实现的,而TreeMap采用了红黑树-一种二叉排序树。
当然不考虑效率,一定用TreeSet,可以这么玩:

 Set set = new TreeSet(Arrays.asList(array));

改成

        Set<String> set = new TreeSet<String>(new Comparator<Object>() {
            @Override
            public int compare(Object o1, Object o2) {
                if(o1.equals(o2)){
                    return 0;
                }else{
                    return 1;
                }
            }
        });
        set.addAll(Arrays.asList(array));

解决方案二:

set是无序的,试着转化成list输出。或者直接就用list

解决方案三:

你是利用了set的去重特性,应该自己写一个去重算法,这样可以保持数据的顺序不被破坏

解决方案四:

1、Set这个接口规范表示的集合没有重复的元素,但是Set的实现类有多个:HashSet、TreeSet、EnumSet、LinkedHashSet等。

其中HashSet表示的元素是无序的,它不能保证按照元素添加的顺序排序,而是元素的hash值;

TreeSet是有序的,它按照元素的大小排序,也不是添加顺序;

EnumSet只能存放某个枚举类的枚举值;

LinkedHashSet继承自HashSet,也根据hashchode来判断存储元素的位置,其中维护了一张链表,所以集合中元素的顺序与插入的顺序一样。

2、按照上述分析,你应该使用LinkedHashSet。
代码修改:

// 将数组转为LinkedHashSet
Set set = new LinkedHashSet(Arrays.asList(array));

解决方案五:

java中字符串的编码解码问题
java中接收字符串的问题
java字符串常见问题

解决方案六:

你这个方法不行,既然想保持原来的顺序,就不要用treeset了。构造一个list,每次放入的时候检查下是否存在。

解决方案七:

用linkedhashset绝对能做出来,记得是绝对哦

时间: 2024-08-03 17:09:23

关于java字符串去重的问题的相关文章

Java中字符串去重的特性介绍_java

字符串在任何应用中都占用了大量的内存.尤其数包含独立UTF-16字符的char[]数组对JVM内存的消耗贡献最多--因为每个字符占用2位. 内存的30%被字符串消耗其实是很常见的,不仅是因为字符串是与我们互动的最好的格式,而且是由于流行的HTTP API使用了大量的字符串.使用Java 8 Update 20,我们现在可以接触到一个新特性,叫做字符串去重,该特性需要G1垃圾回收器,该垃圾回收器默认是被关闭的. 字符串去重利用了字符串内部实际是char数组,并且是final的特性,所以JVM可以任

Java 8新特性:字符串去重

本文首发与InfoQ. 8月19日,Oracle发布了JDK 8u20,JDK 8u20包含很多新特性,比如Java编译器更新.支持在运行时通过API来修改MinHeapFreeRatio和MaxHeapFreeRatio参数.新的GC调优指南文档.不过在众多新特性中,最令人期待的还属字符串去重(String Deduplication ).如何减少内存占用一直是一个永恒的话题,而在Java应用中,经常会看到String对象会占用应用30%的内存,它是Java中最常用的对象之一.新的字符串去重特

Java8新特性之字符串去重介绍_java

8月19日,Oracle发布了JDK 8u20,JDK 8u20包含很多新特性,比如Java编译器更新.支持在运行时通过API来修改MinHeapFreeRatio和MaxHeapFreeRatio参数.新的GC调优指南文档.不过在众多新特性中,最令人期待的还属字符串去重(String Deduplication ).如何减少内存占用一直是一个永恒的话题,而在Java应用中,经常会看到String对象会占用应用30%的内存,它是Java中最常用的对象之一.新的字符串去重特性可以帮助减少应用中St

java实现归并排序和树形排序(锦标赛制):java字符串分隔或的形式

String[] b=str.split("query|,");//query分隔或者逗号分隔 归并排序,递归实现 public class MergeSort2 { // 对data数组中的 [a,b) 区间的数据进行归并排序, // 排序结束后,[a,b)间数据处于升序有序状态 static void mergeSort(int[] data, int a,int b) { if (a >= b) return; int mid=(a+b)/2;//拆分排序 mergeSor

JAVA字符串转日期或日期转字符串

文章中,用的API是SimpleDateFormat,它是属于java.text.SimpleDateFormat,所以请记得import进来! 用法: SimpleDateFormat sdf = new SimpleDateFormat( " yyyy-MM-dd HH:mm:ss " ); 这一行最重要,它确立了转换的格式,yyyy是完整的公元年,MM是月份,dd是日期,至于 HH:mm:ss就不需要我再解释了吧! PS:为什么有的格式大写,有的格式小写,那是怕避免混淆,例如MM

Java字符串分割

1. java.lang.String 的 split() 方法, JDK 1.4 or later split public String[] split(String regex, int limit) 根据匹配给定的正则表达式来拆分此字符串. 此方法返回的数组包含此字符串的每个子字符串,这些子字符串由另一个匹配给定的表达式的子字符串终止或由字符串结束来终止.数组中的子字符串按它们在此字符串中的顺序排列.如果表达式不匹配输入的任何部分,则结果数组只具有一个元素,即此字符串. limit 参数

Java字符串排序中文+数字

  思路: 在Java中,排序需要复写的是 equals 方法 和 Comparable<T> 接口 的public int compareTo(T o); 方法 步骤: 1. 使用正则表达式来判断数字,多个连续的数字作为一组, 2. 一次检索出数字组合, 3. 检出下一组数字,如果有,则进入步骤4,否则进入步骤6. 4. 如果两组数字出现的位置相等,并且前面部分的字符串相等,则进入第5步.否则break,跳到第6步. 5. 如果前面部分的字符串完全一致.则比较两个数字的大小,如果大小一致,则

java字符串拆分,求解,在线等,急用

问题描述 java字符串拆分,求解,在线等,急用 [美元/日元] [超买超卖]请注意:美元/日元威廉指标出现超卖情况,指标利多,现价为109.17 这段话需要拆分成三部分: [美元/日元] [超买超卖] 请注意:美元/日元威廉指标出现超卖情况,指标利多,现价为109.17 求代码.谢谢 解决方案 Pattern p = Pattern.compile("(\[.*?\])\s+(\[.*?\])(.*)"); Matcher m = p.matcher("[美元/日元] [超

java字符串,查abcd出现的次数

问题描述 java字符串,查abcd出现的次数 为了弄清某类考试中,选择题答案abcd的分布情况,需要统计abcd出现的次数.现从键盘输入一行由abcd构成的答案字符串,统计并输出abcd出现的次数.(如果未出现,则次数输出0) 解决方案 http://www.2cto.com/kf/201412/361778.html 解决方案二: 你输入的字符串并不多的,可以把它们放到一个字符数组里,然后分别用a,b,c,d来和字符数组里的字符比较,然后定义三个变量,如果a和字符里某个角标的值相等, 就让一