找到不重复字母在一个字符串第一次出现的索引 三种方法

package 附加题;

import java.util.ArrayList;
import java.util.LinkedHashSet;

/*
 *  找到不重复字母在   一个字符串 第一次出现的索引 .  
 *  比如 不重复字母在 "gooogle" 第一次出现的索引为l字母的索引5
 *  
 *  iljafakszxhfdaljdlasjdlisajfl
 *  LinkedHashSet :  有序的set集合. 
 */
public class Test2_important_不重复_第一次出现____以及LinkedHashSet {
	public static void main(String[] args) {
		fun1();
		fun2();
		fun3();
	}// main

	public static void fun3() {
		System.out.println("==========方式3(也不错哈哈)==========");
		String str1 = "iljafakszxhfdaljdlasjdlisajfl";
		LinkedHashSet<Character> once = new LinkedHashSet<>();
		LinkedHashSet<Character> chongFu = new LinkedHashSet<>();
		ArrayList<Character> list = new ArrayList<>();

		for (int i = 0; i < str1.length(); i++) {
			boolean add = once.add(str1.charAt(i)); // 得到集合里所有出现过一次的元素
			if (!add) {
				chongFu.add(str1.charAt(i));// 得到集合里重复出现的元素
			}
		}
		boolean removeAll = once.removeAll(chongFu); // once里将存储所有不重复的元素
		list.addAll(once);
		System.out.println("所有不重复的字母:" + list);
		for (int i = 0; i < str1.length(); i++) {
			if (list.get(0) == str1.charAt(i)) {
				System.out.println("它的索引为:" + i);
			}
		}
	}

	public static void fun2() {
		System.out.println("======方式2(也凑合 嘻嘻)==========");
		ArrayList<Character> list = new ArrayList<>();
		String str1 = "iljafakszxhfdaljdlasjdlisajfl";

		for (int i = 0; i < str1.length(); i++) {
			int flag = -1;// 定义一个标志
			for (int j = 0; j < str1.length(); j++) {
				if (i == j) {// 如果是同一个元素跳过本次循环,继续下次循环
					continue;
				}
				// 如果这个元素不是第一次出现,将标志改变
				if (str1.charAt(i) == str1.charAt(j)) {
					flag = 1;
				}
			}
			// 未改变标志的元素,即只出现一次的元素
			if (flag == -1) {
				list.add(str1.charAt(i));
			} // if

		} // for
		System.out.println("所有不重复的字母:" + list);
		System.out.println("第一个不重复的字母为:" + list.get(0));
		for (int i = 0; i < str1.length(); i++) {
			if (list.get(0) == str1.charAt(i)) {
				System.out.println("它的索引为:" + i);
			}
		}
	}

	private static void fun1() {
		System.out.println("===========方式1(挺巧妙)=============");
		String s = "iljafakszxhfdaljdlasjdlisajfl";

		for (int i = 0; i < s.length(); i++) {
			char charAt = s.charAt(i);
			// 找出取出的元素第一次出现的位置
			int indexOf = s.indexOf(charAt);
			// 找出取出的元素最后一次出现的位置
			int lastIndexOf = s.lastIndexOf(charAt);
			// 如果是唯一的元素,第一次出现的位置和最后一次出现的位置应该相同
			// 如果相同了就没必要在继续走for循环了
			if (indexOf == lastIndexOf) {
				System.out.println(s.charAt(indexOf));
				System.out.println(indexOf);
				return;
			}
		}
	}
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值