【问题标题】:Sorting a List of Mixed Data?对混合数据列表进行排序?
【发布时间】:2012-11-07 21:25:35
【问题描述】:

我今天有一个面试,我被要求对一个包含字符串和整数的列表进行排序。就像这样

输入:

汽车巴士 4 -5 苹果 3 -1

输出:

苹果巴士 -5 -1 车 3 4

起初我被卡住了,因为我从未见过这样的事情,但我试图做的是创建 2 个子列表,一个包含字符串,另一个包含 int。我这样做了,但时间已经到了我无法完成。

我也卡在了我试图循环遍历列表并检查它的字符串是否比将元素添加到子列表 1 以及它的 int 是否比将元素添加到子列表 2 的部分。我被困在这里,因为我不知道怎么能我检查元素是字符串还是整数。

如果我在错误的部分或其他地方发布了这个问题,也很抱歉。请随时将此问题移至正确的部分。

谢谢

【问题讨论】:

  • Re: 检查 string 还是 int: 尝试解析它?什么是“更高”、数字或字符串?输入是怎么来的,都是字符串?
  • 我要向面试官指出的第一件事是-1 也是一个字符串......然后我会讨论区分差异的方法(可能尝试解析它和try/catch (NumberFormatException e) ...)
  • @DaveNewton 解析正是我想到的。他向我展示了我上面写的输出我想他希望我在排序时优先考虑单词而不是数字。他什么也没说关于输入是如何来的。他说它是字符串和整数的组合。感谢您的回复。
  • @durron597 解析出现在我的脑海中,但我认为我失去了它,因为时间即将结束并且我承受着压力:) 我认为每次尝试解析每个元素都需要很多时间那么还有其他方法吗?感谢您的回复。
  • 为什么是-1 -5?在输出中应该是-5 -1

标签: java algorithm list sorting collections


【解决方案1】:

我会使用两个列表,对它们进行排序,但您必须记住原始排序,LinkedList<Boolean> 足以完成该任务。

public static String sortString(String input) {
    Scanner s = new Scanner(input);

    LinkedList<String> strings = new LinkedList<String>();
    LinkedList<Integer> integers = new LinkedList<Integer>();
    LinkedList<Boolean> types = new LinkedList<Boolean>();

    while(s.hasNext()) {
        String nextToken = s.next();
        try {
            int nextInteger = Integer.parseInt(nextToken);
            integers.add(nextInteger);
            types.add(true);
        } catch(NumberFormatException e) {
            strings.add(nextToken);
            types.add(false);
        }
    }

    Collections.sort(strings);
    Collections.sort(integers);

    StringBuilder builder = new StringBuilder();

    Iterator<Boolean> iter = types.iterator();

    while(iter.hasNext()) {
        boolean currType = iter.next();
        if (currType) {
            builder.append(integers.remove(0));
        } else {
            builder.append(strings.remove(0));
        }
        if (iter.hasNext()) builder.append(" ");
    }

    return builder.toString();
}

【讨论】:

    【解决方案2】:

    假设-1 和-5 是int 一个简单的解决方案:

    public String sortStringWithInts(String input){  
            String[] parts = input.split("\\s");  
            List<String> strings = new ArrayList<String>();  
            List<Integer> ints = new ArrayList<Integer>();  
            for(String part:parts){  
                if(isNumber(part)){                 
                     ints.add(Integer.valueOf(part));               
                }  
                else{  
                    strings.add(part);  
                }  
            }  
            Collections.sort(strings);  
            Collections.sort(ints);  
            return createResult(strings, ints, parts);           
        }  
    
        private String createResult(List<String> strings, List<Integer> ints, String[] parts) {  
            StringBuilder result = new StringBuilder();       
            for(String part:parts){  
                if(isNumber(part)){  
                    result.append(ints.remove(0)).append(" ");              
                }  
                else{  
                    result.append(strings.remove(0)).append(" ");  
                }  
            }  
    
            return result.toString();  
        }  
    
        private boolean isNumber(String part) {  
            try{  
                Integer.valueOf(part);  
                return true;  
            }  
            catch(Exception e){  
                return false;  
            }  
        }  
    

    注意:输出将是:apple bus -5 -1 car 3 4,因为 -5 &lt; -1 而不是像您的 OP 中那样

    【讨论】:

      猜你喜欢
      • 2018-10-17
      • 2013-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-15
      • 2012-06-07
      • 1970-01-01
      相关资源
      最近更新 更多