class CombinationItem implements Item {

        StringItem stringPart;

        Item digitPart;

        CombinationItem(String value) {
            int index = 0;
            for (int i = 0; i < value.length(); i++) {
                char c = value.charAt(i);
                if (Character.isDigit(c)) {
                    index = i;
                    break;
                }
            }

            stringPart = new StringItem(value.substring(0, index), true);
            digitPart = parseItem(true, value.substring(index));
        }

        @Override
        public int compareTo(Item item) {<FILL_FUNCTION_BODY>}

        public StringItem getStringPart() {
            return stringPart;
        }

        public Item getDigitPart() {
            return digitPart;
        }

        @Override
        public int getType() {
            return COMBINATION_ITEM;
        }

        @Override
        public boolean isNull() {
            return false;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) {
                return true;
            }
            if (o == null || getClass() != o.getClass()) {
                return false;
            }
            CombinationItem that = (CombinationItem) o;
            return Objects.equals(stringPart, that.stringPart) && Objects.equals(digitPart, that.digitPart);
        }

        @Override
        public int hashCode() {
            return Objects.hash(stringPart, digitPart);
        }

        @Override
        public String toString() {
            return stringPart.toString() + digitPart.toString();
        }
    }

            if (item == null) {
                // 1-rc1 < 1, 1-ga1 > 1
                return stringPart.compareTo(item);
            }
            int result = 0;
            switch (item.getType()) {
                case INT_ITEM:
                case LONG_ITEM:
                case BIGINTEGER_ITEM:
                    return -1;

                case STRING_ITEM:
                    result = stringPart.compareTo(item);
                    if (result == 0) {
                        // X1 > X
                        return 1;
                    }
                    return result;

                case LIST_ITEM:
                    return -1;

                case COMBINATION_ITEM:
                    result = stringPart.compareTo(((CombinationItem) item).getStringPart());
                    if (result == 0) {
                        return digitPart.compareTo(((CombinationItem) item).getDigitPart());
                    }
                    return result;
                default:
                    return 0;
            }
        
<no_super_class>