java中的HashMap函数keyset()

时间:2017-04-26 16:46:05

标签: java string hashmap keyset

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()内部设置的)之后我创建了一个长度键数组并将字符串放入其中以便返回。但它的顺序不同。

5 个答案:

答案 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也将保持相同的插入顺序。