HashMap<Character,Character> h=new HashMap<>();
for(int i=0; i<str.length(); i++){
h.put(str.charAt(i),str.charAt(i));
}
Set<Character> keys=h.keySet();
Character [] arr=new Character[keys.size()];
keys.toArray(arr);
String ans="";
for(int i=0; i<arr.length; i++) {
ans+=arr[i];
}
在这个问题中,我必须从输入的字符串中删除重复项。它对于普通字符工作正常,但是当输入如:o&6nQ0DT$3
,即包含特殊字符时,则不会按顺序打印。
input: o&6nQ0DT$3
expected output: o&6nQ0DT$3
my output: 0Q3DT$&6no
我在一组&#34;键&#34;中获得keyset()
方法返回的值。 (因为返回类型是在keyset()
内部设置的)之后我创建了一个长度键数组并将字符串放入其中以便返回。但它的顺序不同。
答案 0 :(得分:2)
HashSet
(或LinkedHashMap
,就此而言)没有内在的顺序。事实上,这对一些投入来说只是一个幸运的事。您可以使用String input = "o&6nQ0DT$3";
String output = input.chars()
.distinct()
.mapToObj(c -> String.valueOf((char) c))
.collect(Collectors.joining());
,如@javaguy建议的那样,或者使用流可能更容易实现整个练习:
typedef enum {
rProduct,
rAddMoreItem,
rItem,
rBill,
rApplyCoupon,
rGrandTotal,
rBottomInfo,
rNumerOfRows
} SectionType;
[myTableView registerNib:[UINib nibWithNibName:[FPMCartTableViewCell tableViewIdentifier] bundle:nil]
forCellReuseIdentifier:[FPMCartTableViewCell tableViewIdentifier]];
[myTableView registerNib:[UINib nibWithNibName:[FPMAddMoreItemsTableViewCell tableViewIdentifier] bundle:nil]
forCellReuseIdentifier:[FPMAddMoreItemsTableViewCell tableViewIdentifier]];
[myTableView registerNib:[UINib nibWithNibName:[FPMItemTableViewCell tableViewIdentifier] bundle:nil]
forCellReuseIdentifier:[FPMItemTableViewCell tableViewIdentifier]];
[myTableView registerNib:[UINib nibWithNibName:[FPMApplyCouponTableViewCell tableViewIdentifier] bundle:nil]
forCellReuseIdentifier:[FPMApplyCouponTableViewCell tableViewIdentifier]];
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
int noOfRows = 0;
switch (section) {
case rProduct:
noOfRows = 2;
break;
case rAddMoreItem:
noOfRows = 1;
break;
case rItem:
noOfRows = 3;
break;
case rBill:
noOfRows = 1;
break;
case rApplyCoupon:
noOfRows = 1;
break;
case rGrandTotal:
noOfRows = 1;
break;
case rBottomInfo:
noOfRows = 1;
break;
}
return noOfRows;
}
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return rNumerOfRows;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 100;
}
And added in the cellForRowAtIndexPath method :
{
UITableViewCell *cell;
switch (indexPath.section) {
case rProduct:
{
NSString *identifer = [FPMCartTableViewCell tableViewIdentifier];
FPMCartTableViewCell *cell1 = (FPMCartTableViewCell *)[tableView dequeueReusableCellWithIdentifier:identifer];
if (!cell1)
{
cell1 = [[FPMCartTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifer];
}
[self configureCell:cell1 forIndexPath:indexPath];
cell = cell1;
}
break;
case rAddMoreItem:
{
NSString *identifer = [FPMAddMoreItemsTableViewCell tableViewIdentifier];
FPMAddMoreItemsTableViewCell *cell2 = (FPMAddMoreItemsTableViewCell *)[tableView dequeueReusableCellWithIdentifier:identifer];
if (!cell2)
{
cell2 = [[FPMAddMoreItemsTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifer];
}
cell2.backgroundColor = [UIColor redColor];
cell = cell2;
}
break;
case rItem:
{
NSString *identifer = [FPMItemTableViewCell tableViewIdentifier];
FPMItemTableViewCell *cell1 = (FPMItemTableViewCell *)[tableView dequeueReusableCellWithIdentifier:identifer];
if (!cell1)
{
cell1 = [[FPMItemTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifer];
}
cell = cell1;
}
break;
case rBill:
{
NSString *identifer = [FPMItemTableViewCell tableViewIdentifier];
FPMItemTableViewCell *cell1 = (FPMItemTableViewCell *)[tableView dequeueReusableCellWithIdentifier:identifer];
if (!cell1)
{
cell1 = [[FPMItemTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifer];
}
cell = cell1;
}
break;
case rApplyCoupon:
{
NSString *identifer = [FPMApplyCouponTableViewCell tableViewIdentifier];
FPMApplyCouponTableViewCell *cell1 = (FPMApplyCouponTableViewCell *)[tableView dequeueReusableCellWithIdentifier:identifer];
if (!cell1)
{
cell1 = [[FPMApplyCouponTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifer];
}
cell = cell1;
}
break;
case rGrandTotal:
{
NSString *identifer = [FPMItemTableViewCell tableViewIdentifier];
FPMItemTableViewCell *cell1 = (FPMItemTableViewCell *)[tableView dequeueReusableCellWithIdentifier:identifer];
if (!cell1)
{
cell1 = [[FPMItemTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifer];
}
cell = cell1;
}
break;
case rBottomInfo:
{
if(!cell){
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cell"];
}
cell.textLabel.text = @"Select Delivery and payment options in next step";
}
break;
}
[cell setHidden:NO];
return cell;
}
答案 1 :(得分:1)
HashMap不保证/保留元素的插入顺序,因此请使用LinkedHashMap
来保留您要插入的字符的顺序:
Map<Character,Character> h = new LinkedHashMap<>();//use LinkedHashMap
答案 2 :(得分:1)
可以在没有HashMap的情况下完成吗?
String str = "Teste";
String finalStr = "";
for (Character charInString: str.toCharArray()) {
if(!finalStr.contains(charInString.toString()))
{
finalStr += charInString;
}
}
System.out.println(finalStr);
改善,怎么样?使用 TreeSet 的解决方法。
String str = "teste";
HashMap<Integer, Character> map = new HashMap<>();
for (int i = 0; i < str.length(); i++) {
if (!map.containsValue(str.charAt(i))) {
map.put(i, str.charAt(i));
}
}
SortedSet<Integer> keys = new TreeSet<Integer>(map.keySet());
keys.forEach(k -> System.out.println(k + " value " + map.get(k).toString()));
答案 3 :(得分:1)
LinkedHashMap &amp; LinkedHashSet 维护广告订单。
String s = "o&6nQ0DT$3";
Map<Character,Character> hm = new LinkedHashMap<>();
for(Character c:s.toCharArray())
hm.put(c, c);
System.out.println(hm);
输出:
{o=o, &=&, 6=6, n=n, Q=Q, 0=0, D=D, T=T, $=$, 3=3}
但 LinkedHashSet 在内部使用hashmap来存储值,因此 LinkedHashMap 的性能稍好一些。
答案 4 :(得分:0)
我不知道你是如何完全使用hashmap的,也许你想用ArrayList替换,如下所示:
ArrayList<Character> h = new ArrayList<>();
for(int i=0;i<str.length();i++)
{
if(!h.contains(str.charAt(i)))
h.add(str.charAt(i));
}
...
arraylist也将保持相同的插入顺序。