java一个定常字符串,求出相邻两个相同元素出现的次数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java一个定常字符串,求出相邻两个相同元素出现的次数相关的知识,希望对你有一定的参考价值。

例如asdfddfangaanaassdss中dd出现一次/aa出现2次/dd出现2次
类似于冒泡排序中相邻两个元素两两对比;

public class Test 
public static void main(String[] args) 
String s="asdfddfangaanaassdss";
String arr[],srr[],str="";
StringBuilder stb=new StringBuilder();
for (int i = 0; i < s.length()-1; i++) 
if(s.charAt(i)==s.charAt(i+1)) 
stb.append(s.substring(i,i+2)+",");
arr=new String(stb).split(",");
for (int i = 0; i < arr.length; i++) 
if(!str.contains(arr[i])) 
str+=arr[i]+",";
srr=new String(str).split(",");
for (int i = 0; i < srr.length; i++) 
int count=0;
for (int j = 0; j < arr.length; j++) 
if(srr[i].equals(arr[j]))
count++;
System.out.println(srr[i]+"出现:"+count+"次");


参考技术A import java.util.ArrayList;
public class Test
public static void main(String[] args)
String s = "abcdaebijkd";
ArrayList list = new ArrayList();
for(int i=0; i<s.length(); i++)
char c = s.charAt(i);
if(s.indexOf(c,i+1)>-1)
Character ch = new Character(c);
if(!list.contains(ch))
list.add(ch);


for(int i=0; i<list.size(); i++)
System.out.print(list.get(i)+",");


Windows PowerShell

Java中List 删除元素

在Java中,使用List时想要删除某个特定个元素怎么办?很好办!因为List接口有remove()这个方法,我们只需要调用remove()方法,就可以删除list中的某个元素。但是list自带的有一些坑,在相邻有相同元素时会掉坑:

使用list.remove()删除:

 

 

我们看到有两个“a”元素相邻,但是删除时却只删除了一个,这是为何呢?因为删除时,每删除一个元素,后边的元素都会左移一位,也就是下标会减1,在for循环中,删除第一个“a”时,i(下标)为0,此时list重排,后边的元素全部左移1位,也就是说第二个“a”元素的下标从1变为了0,而此时for循环进行已经第二次循环了,执行了i++,i的值为1,对应为“b”元素,然后向后循环,再也找不到“a”元素了。所以相邻元素有重复的话,只能删除一个。这明显不符合我们的需求。

那解决办法是什么呢?

1.删除后元素后,i-1

 

 

删除一个元素后,后边的元素左移1位,此时i-1,保证了下次循环能访问到左移了1位的元素。

2.反向删除

我们先从后边的元素开始循环,一个一个的往前面循环,找出特定元素删除

 

 

这样,就算删除了倒数第一个"a"元素,list重排,也只是把后边的元素左移1位,此时倒数第一个“a”元素(下标为1)被删除,接着b替代了a成为了下标为1的元素,但前边的元素不变,i--  = 0 后依然能够找到其相邻的a元素。

3.使用迭代器删除(iterator)(推荐)

 

 

 

Iterator.remove() 方法会在删除当前迭代对象的同时,会保留原来元素的索引。所以用迭代删除元素是最保险的方法,建议大家使用List过程,这其实和上面第一中方法类似,只不过iterator内部帮我们做了类似i-1的操作。推荐使用这种做法,因为我们不保证每次都记得手动把下标减去1。

4.赋值给新的list

其实我们可以转换思维,可以过滤掉不需要的元素后赋值给新的list对象,利用java8的lambda表达式和强大的stream流形式进行内部迭代来过滤掉特定元素,我们只需一行代码就可以实现。虽然这种方式比较简洁,但是定义了新变量,旧的list就只能等待漫长的gc了。

注意:在进行普通for循环删除时,不要把list.size()抽离出去赋值给变量,然后用此变量做为for条件, 因为删除时,list.size()的值是会改变的,要把list.size作为for条件。

 

 



以上是关于java一个定常字符串,求出相邻两个相同元素出现的次数的主要内容,如果未能解决你的问题,请参考以下文章

字符序列

、设数组a有10个整型元素,编程求出a中各相邻两个元素的和,并存入数组b中,然后输入

找出数组 arr 中重复出现过的元素

Java 求解删除字符串中的所有相邻重复项

C语言:求出a中各相邻两个元素的和,并将这些和存放在数组 b中

Leetcode——重构字符串(相邻不同 / 奇偶交叉)