HashSet<String> 筛选出重复的字符串
时间: 2023-05-19 19:05:54 浏览: 189
可以使用 HashSet<String> 和 ArrayList<String> 来实现筛选出重复的字符串。具体实现代码如下:
```java
HashSet<String> set = new HashSet<>();
ArrayList<String> list = new ArrayList<>();
// 假设有一个字符串数组 arr
for (String str : arr) {
if (!set.add(str)) {
list.add(str);
}
}
// list 中即为重复的字符串
```
这段代码的原理是,HashSet 的 add() 方法会返回一个 boolean 值,表示是否添加成功。如果添加不成功,说明这个字符串已经存在于 HashSet 中,即为重复字符串,将其添加到 ArrayList 中即可。
相关问题
public Dictionary<string, List<BasicEntity>> ValidateProcess(string excelFile) { var readExcelResp = excelReader.ReadExcel(excelFile); foreach (var keyValuePair in readExcelResp) { var errors = new List<BasicEntity>(); foreach (var basicEntity in keyValuePair.Value) { var validationResult = ExecuteValidate(basicEntity); if (validationResult != null && !validationResult.IsValid) { errors.Add(basicEntity); foreach (var validationResultError in validationResult.Errors) { excelErrorLogService.AddErrorLog(basicEntity.MigrationRowNum.ToString(), validationResultError.ErrorMessage, keyValuePair.Key); } } } if (errors.Any()) { keyValuePair.Value.RemoveAll(i => errors.Contains(i)); } if (keyValuePair.Value.Any()) { var verifySet = new HashSet<string>(); var sameList = new List<BasicEntity>(); var identity = keyValuePair.Value[0].GetIdentity(); if (!string.IsNullOrEmpty(identity)) { var fields = identity.Split(""); foreach (var basicEntity in keyValuePair.Value) { List<string> fieldsValue = new(); foreach (var field in fields) { fieldsValue.Add(basicEntity.GetType() .GetField(field, BindingFlags.NonPublic | BindingFlags.Instance).GetValue(basicEntity) ?.ToString()); } var values = string.Join("", fieldsValue); if (verifySet.Contains(values)) { sameList.Add(basicEntity); _excelErrorLogService.AddErrorLog(basicEntity.MigrationRowNum.ToString(), $"Fields {fields} values repetition" , keyValuePair.Key); } else { verifySet.Add(values); } } } } } return readExcelResp; } 优化这段代码
这段代码可以进行以下优化:
1. 使用 LINQ 来简化代码,例如使用 `Where` 和 `Select` 来筛选和映射集合,使用 `Any` 和 `All` 来判断集合是否为空或满足条件。
2. 将重复的代码抽象成方法或者变量,避免代码重复。
3. 使用 `StringBuilder` 来拼接字符串,避免大量的字符串连接操作。
下面是优化后的代码:
```
public Dictionary<string, List<BasicEntity>> ValidateProcess(string excelFile)
{
var readExcelResp = excelReader.ReadExcel(excelFile);
foreach (var keyValuePair in readExcelResp)
{
var errors = keyValuePair.Value
.Select(ExecuteValidate)
.Where(validationResult => validationResult != null && !validationResult.IsValid)
.SelectMany(validationResult => validationResult.Errors.Select(error => (validationResult.BasicEntity, error)))
.ToList();
errors.ForEach(error => _excelErrorLogService.AddErrorLog(error.BasicEntity.MigrationRowNum.ToString(), error.ErrorMessage, keyValuePair.Key));
keyValuePair.Value.RemoveAll(errors.Select(error => error.BasicEntity).Contains);
if (keyValuePair.Value.Any())
{
var identityFields = keyValuePair.Value.FirstOrDefault()?.GetIdentity()?.Split(";");
if (identityFields != null)
{
var sameList = new List<BasicEntity>();
var verifySet = new HashSet<string>();
foreach (var basicEntity in keyValuePair.Value)
{
var values = identityFields.Select(field => basicEntity.GetType().GetField(field, BindingFlags.NonPublic | BindingFlags.Instance)?.GetValue(basicEntity)?.ToString()).Aggregate(new StringBuilder(), (sb, value) => sb.Append(value)).ToString();
if (verifySet.Contains(values))
{
sameList.Add(basicEntity);
_excelErrorLogService.AddErrorLog(basicEntity.MigrationRowNum.ToString(), $"Fields {string.Join(",", identityFields)} values repetition", keyValuePair.Key);
}
else
{
verifySet.Add(values);
}
}
keyValuePair.Value.RemoveAll(sameList.Contains);
}
}
}
return readExcelResp;
}
```
优化代码 string str = "Programmatic Python"; char[] str2 = str.ToCharArray(); List<char> newStr = new List<char>(); for (int i = 0; i < str2.Length; i++) { for (int j = 1 + i; j < str2.Length; j++) { if (str2[i] == str2[j]) { newStr.Add(str2[i]); } } } foreach (char item in newStr) { Console.WriteLine(item); }
这段代码的作用是找出字符串 "Programmatic Python" 中重复出现的字符,并输出这些字符。
首先,这段代码可以使用 HashSet<char> 来简化,HashSet 会自动去重:
```csharp
string str = "Programmatic Python";
HashSet<char> newStr = new HashSet<char>();
for (int i = 0; i < str.Length; i++) {
for (int j = i + 1; j < str.Length; j++) {
if (str[i] == str[j]) {
newStr.Add(str[i]);
}
}
}
foreach (char item in newStr) {
Console.WriteLine(item);
}
```
此外,我们还可以使用 LINQ 来进一步简化:
```csharp
string str = "Programmatic Python";
var newStr = str.Where((c, i) => str.Substring(i + 1).Contains(c)).Distinct();
foreach (var item in newStr) {
Console.WriteLine(item);
}
```
这里使用了 Where 方法来筛选出符合条件的字符,使用 Substring 方法来截取字符串,使用 Contains 方法来判断字符是否存在于截取后的字符串中,最后使用 Distinct 方法去重。
阅读全文