JAVA 使用TreeMap实现计算字符串中出现的字符索引

本文介绍了一种使用TreeMap来统计字符串中每个字符出现位置的方法。通过Java代码实例,展示了如何对字符串“HelloWorld”进行处理,得到各字符及其在字符串中的所有位置。同时,提供了Python和简化版Java代码对比,突出了不同语言实现同一功能的差异。

题目:使用TreeMap实现计算字符串中出现的字符索引(字符在串中的位置)。 例如输入“Hello World”,运行该程序将得到的结果为: { =[5], H=[0], W=[6], d=[10], e=[1], l=[2, 3, 9], o=[4, 7], r=[8]}
代码:

package text;

import java.util.*;

public class Student {
	static public void main(String[] args) {
		String ktu = "Hello World";
		char stu[] = ktu.toCharArray();
		char rtu[] = ktu.toCharArray();
		char temp;
		int count=0;
		for(int i=0;i<11;i++) {
			for(int j=0;j<10-i;j++) {
				if(rtu[j]>rtu[j+1]) {
					temp = rtu[j];
					rtu[j] = rtu[j+1];
					rtu[j+1] = temp;
				}
			}
		}
		int ctu[] = new int[11];
		List<Object> dist = new ArrayList<Object>();
		Map<Object, Integer> map= new HashMap<Object, Integer>();	// 放置重复字符及其重复次数
		for (Object item : rtu) {
			if (dist.contains(item)) {	// 如果包含此字符则放入map
				map.put(item, map.get(item)+1);
			} else {
				dist.add(item);
				map.put(item, 0);
			}
		}
		for(Object ch:dist) {
			String gh = String.valueOf(ch);
			for(int i=0;i<stu.length;i++) {
				String fh = String.valueOf(stu[i]);
				if(fh.equals(gh) && ctu[i]==0) {
						List<String> list = new ArrayList<String>(); 
						if(ctu[i] == 0) {
							if(count==0) {
								System.out.print("{");
							}
							System.out.print(stu[i]+"=");
							list.add(String.valueOf(i));
						}
					
						for(int j=i+1;j<stu.length;j++) {
							if(stu[i] == stu[j] && ctu[i] == 0) {
								ctu[j] = 1;
								list.add(String.valueOf(j));
							}
						}
						if(ctu[i] == 0) {
							System.out.print(list);
							count++;
							if(count<dist.size()) {
								System.out.print(", ");
							}
							if(count == dist.size()) {
								System.out.println("}");
							}
						}
				}
			}
		}
	}
}

这个东西还是蛮难弄的在网上也找不到资源只能自己摸索,貌似花了我两个小时吧,觉得比较有意义,希望这个能帮到对于这个有困扰的你吧。如果有什么错误的地方,还望批评指正,当然有什么建议也可以提的啦,嘿嘿。

2019/12/25增:
这里附上python代码,简直了,差别太大了:

def solve():
    stu = "Hello World"
    ctu = list(set(stu))
    ctu.sort()
    ok = 0
    print(ctu)
    for i in ctu:
        ok += 1
        ktu = []
        for j, p in zip(stu, range(len(stu))):
            if i == j:
                ktu.append(p)
        if ok == 1:
            print("{", end='')
        print("{0}={1}".format(i, ktu), end=' ')
        if ok == len(ctu):
            print("}")

solve()
exit(0)

你没看错就这么点,我…
2019/12/28增:
简化版java:

package text;

import java.util.*;

public class Student {
	public static void main(String args[]) {
		Scanner sc = new Scanner(System.in);
		List<String> list=new ArrayList<String>();
		String stu="Hello World";
		char ctu[]=stu.toCharArray();
		for(char i:ctu) {
			String ktu=String.valueOf(i);
			if(!list.contains(ktu)) {
				list.add(ktu);
			}
		}
		Collections.sort(list);
		for(int i=0;i<list.size();i++) {
			List<String> pta=new ArrayList<String>();
			for(int j=0;j<ctu.length;j++) {
				if(String.valueOf(ctu[j]).equals(list.get(i))) {
					pta.add(String.valueOf(j));
				}
			}
			if(i==0)System.out.print("{"+list.get(i)+"="+pta.toString()+", ");
			else if(i<list.size()-1)System.out.print(list.get(i)+"="+pta.toString()+", ");
			else System.out.println(list.get(i)+"="+pta.toString()+"}");
		}
	}
}

看来还是自己还不够秃啊,现在看起来还是差不多的

<think>首先,用户的问题是:"我想了解JavaMap的key字符串长度限制请问JavaMapkey字符串最大长度限制"。这基于提供的引用,我需要参考这些引用来回答。从引用中提取相关信息:-引用[1]和[2]讨论JavaString的长度限制。引用[1]说String的长度由length()方法返回int类型限制,int的最大值是2^31-1(2147483647)。引用[2]同样说String的最大长度是int的最大值,约4GB。-引用[3]是关于判断Map中值(nickname)的长度,但不直接涉及key的长度限制。它提到Map.Entry遍历。-引用[4]提到Redis的String类型value最大512M,但这是Redis相关,不是JavaMap。-引用[5]也说JavaString的长度在运行期限制在Integer.MAX_VALUE(约4G)。用户的问题具体是JavaMapkey字符串的长度限制。由于Mapkey通常是String,所以在Java中,Mapkey的字符串长度限制应该与String自身的最大长度相同。在Java中,Map是一个接口,其实现如HashMapTreeMap等。键的类型由开发者指定,通常是String。String的实例存储在JVM中,其长度受限于数组的大小,因为String内部使用char数组(在Java8及之前是char[],在Java9+可能使用byte[])。关键点是:-String的长度由intlength()方法返回,其返回类型int的限制是2^31-1。-因此,String的最大长度是Integer.MAX_VALUE,即2147483647个字符。对于Mapkey,只要String实例有效,就可以作为key。Map实现(如HashMap)没有额外的长度限制;它们依赖equals()和hashCode()方法。String类正确实现了这些,所以任何长度的String都可以作为key,只要长度不超过理论最大。在实际中,受限于JVM的堆内存大小。如果String太大,可能导致OutOfMemoryError。总结回答:-JavaMapkey(如果key是String)的字符串最大长度限制是Integer.MAX_VALUE(2147483647)。-这基于String类的实现。结构化回答:1.**引入问题**:直接回答用户的问题。2.**解释原因**:引用相关引用来说明String的长度限制。3.**注意点**:提到堆内存限制,但在理论上最大是Integer.MAX_VALUE。4.**生成相关问题**:根据指令,在回答结束时添加相关问题。系统指令:-使用$...$或$$...$$formathexpressions。这里可能不需要数学,但可以提及数值。-中文回答。-引用的段落末尾添加引用标识,如[^1]。引用的对应:-[^1]for引用[1]:JavaStringlengthlimitduetointtype.-[^2]for引用[2]:JavaStringmaxlengthInteger.MAX_VALUE.-[^3]for引用[3]:Mapvaluelengthcheck,butnotdirectlykey.-[^4]for引用[4]:Redis,notrelevant.-[^5]for引用[5]:JavaStringruntimelimit.Mostrelevant:[^1],[^2],[^5]forStringlength.ForMapkeyspecifically,sincekeyisoftenString,thelimitapplies.回答结构:-第一步:明确回答问题。-第二步:解释String长度限制。-第三步:强调对于Mapkey,相同限制适用。-最后:添加引用标识和相关问题。相关问题生成:基于主题,如String长度限制在JavaMap使用的最佳实践等。例如:1.Java字符串长度超过最大限制时会发生什么?2.Map实现如何处理的哈希冲突?3.最佳实践处理大键值在Map中?确保回答可靠:基于标准Java知识。</think> ### JavaMap键的字符串长度限制 您的需求是了解Java中的`Map`键(当键为字符串类型时)的最大长度限制。基于您提供的引用内容(尤其是[^1]和[^2],它们详细讨论了Java String类的长度限制),我将逐步解释这个问题。在Java中,`Map`(如`HashMap`或`TreeMap`)的键通常可以是字符串(String类型),其长度限制主要由Java语言规范和String类的实现决定。下面我从核心原理、理论限制、实际约束和相关注意事项进行说明。 #### 1. **核心原理:Java String类的长度限制** - Java中的字符串(String)内部存储为一个字符数组(在Java 8之前是`char[]`,Java 9+可能改为`byte[]`优化存储)。字符串的长度通过`length()`方法获取,这个方法返回`int`类型的值。 - `int`类型的最大取值范围由Java定义,为**$2^{31} - 1$**(即**$2147483647$**),因为数组索引和长度计算基于整数类型。 - 因此,String的最大理论长度是**$2147483647$**个字符(约4GB数据,假设每个字符占用1~4字节,具体取决于编码)。如果超过这个长度,String构造函数或方法(如`new String()`)会抛出异常(如`StringIndexOutOfBoundsException`)[^1][^2][^5]。 - 引用原文:"int类型的最大长度即为String的最大长度",并且"数组的最大长度可以是[0~2^31]"[^1][^2]。 #### 2. **Map键的字符串长度限制** - **限制继承自String类**:在Java中,`Map`键可以是任何对象类型,但如果您使用字符串作为键(例如`Map<String, Object>`),其最大长度限制与String自身的限制相同,即**$2147483647$**个字符Map实现(如`HashMap`)不额外限制键的长度,它们通过`equals()`和`hashCode()`方法比较键值,而String类正确实现了这些方法。 - 例如,HashMap存储键时,完全依赖键对象的内部结构,没有额外约束。 - **运行时验证**:如果尝试创建一个长度超过**$2147483647$**的String作为Map键,创建String时就会失败(抛异常),而不是在Map操作中失败。但在运行期,如果String长度超过此限制,可能会抛出`OutOfMemoryError`或其他异常[^5]。 #### 3. **实际约束和注意事项** - **堆内存限制**:虽然理论最大长度为**$2147483647$**,但在实际应用中,JVM堆内存大小(如通过`-Xmx`参数设置)会限制可分配的String大小。例如,默认JVM堆可能只有几百MB,创建一个超长字符串会快速耗尽内存,导致`OutOfMemoryError`。通常,实际应用中建议字符串长度远小于此值(如MB级别)以避免性能问题。 - **Map操作的影响**:Map的`put()`或`get()`方法效率取决于键的hash计算。超长字符串作为键可能会导致哈希冲突增加(因为String的`hashCode()`方法遍历所有字符),影响Map性能。但不是长度限制本身,而是效率问题。引用[^3]展示了如何判断Map值长度(如nickname),类似方法可用于键验证: ```java // 示例:检查Map字符串长度是否超过自定义限制(如100) int maxKeyLength = 100; Map<String, Object> myMap = new HashMap<>(); myMap.put("shortKey", "value1"); myMap.put("aVeryLongKeyThatExceedsTheLimit...", "value2"); // 假设此键长度 > maxKeyLength for (Map.Entry<String, Object> entry : myMap.entrySet()) { String key = entry.getKey(); if (key.length() > maxKeyLength) { System.out.println("键: \"" + key + "\" 超过最大长度 " + maxKeyLength); } } ``` - **最佳实践**: - 避免使用超长字符串作为Map键:优先使用较短键名(如ID或哈希值)以提高性能。 - 如果必须处理大字符串,考虑压缩或序列化技术。 - 测试时,可通过`Integer.MAX_VALUE`检查边界,例如:`if (key.length() == Integer.MAX_VALUE) ...`,但实践中很少需要[^2]。 总结:Java Map键的字符串最大长度限制为**$2147483647$**个字符(Integer.MAX_VALUE),由String类的实现决定[^1][^2][^5]。在实际开发中,堆内存大小是更常见的约束因素。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值