排序混合数据列表?

时间:2012-11-19 21:29:57

标签: java algorithm list sorting collections

今天我接受了采访,并且我被要求对包含String和Integers的列表进行排序。这就像这样

输入:

汽车公交车4 -5苹果3 -1

输出:

苹果巴士-5 -1车3 4

我一开始就被困住,因为我从未见过这样的东西,但我试图做的是创建2个子列表,一个持有字符串,另一个持有int.I做了这个,但时间已经到了我无法完成。

此外,我被困在我尝试循环列表的部分,并检查它的字符串是否添加元素到子列表1,如果它的int比将元素添加到子列表2.我被困在这里bcoz我不知道怎么能我检查元素是否为String或Int。

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

谢谢

2 个答案:

答案 0 :(得分:2)

我会使用两个列表,对它们进行排序,但您必须记住原始排序,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();
}

答案 1 :(得分:1)

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

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 < -1而不是你的OP