Android Дичь - ещё один розыгрыш билета на Saint AppsConf
Alexey MileevЧтобы выиграть билет, нужно прислать мне сниппет очень хорошего кода. Вот чтобы смотришь на него, и душа радуется. Читаешь его, а по телу разливается доброта. Показываешь его маме, а её разбирает гордость. Вот такой хороший кусок кода нужно прислать. Ну и добавить каких-то пояснений, если не сразу понятно, откуда он и зачем.
Победил @a_jukov.
Лучшее из того, что прислали:
and
SQLite. Тестирует Random() на повторы. Спойлер - bigint рулит.
Сниппет прекрасен! Блин, опять с него протащился)
-- the number of repetitions of the random number generator.
-- 1) BIGINT: 0 (!!) repeties for 100 000 000 (!!!) iterations
WITH RECURSIVE
cnt(x) AS (
SELECT ABS(RANDOM())
UNION ALL
SELECT ABS(RANDOM()) FROM cnt
LIMIT 100000
)
SELECT x, Count(x) as count_rand FROM cnt GROUP BY x HAVING count_rand > 1;
-- 2) INTEGER: 2-3 repeties for 100 000 iterations. 200-250 repeties for 100 000 000 iterations.
WITH RECURSIVE
cnt(x) AS (
SELECT ABS(RANDOM()) % (2147483647 - 1) + 1
UNION ALL
SELECT ABS(RANDOM()) % (2147483647 - 1) + 1 FROM cnt
LIMIT 1000000
)
SELECT x, Count(x) as count_rand FROM cnt GROUP BY x HAVING count_rand > 1;
@axrorxoja_yodgorov
Hi,It's not my code but very funny for me

@zaoroman
Это десять строк, заполняющих интерактивную шахматку (схематичное расположение квартир на плане дома) в приложении, которое мы разрабатывали для агентств недвижимости. 🙂
CardView addCardVew(int row, int coll, int rowSpan, int collSpan, @LayoutRes int resId) {
rowSpan = rowSpan == 0 ? 1 : rowSpan;
collSpan = collSpan == 0 ? 1 : collSpan;
CardView cardView = (CardView) LayoutInflater.from(getContext()).inflate(resId, binding.chess, false);
binding.chess.addView(cardView);
GridLayout.LayoutParams p = (GridLayout.LayoutParams) cardView.getLayoutParams();
p.setGravity(Gravity.FILL);
p.rowSpec = GridLayout.spec(row, rowSpan, 1f);
p.columnSpec = GridLayout.spec(coll, collSpan, 1f);
return cardView;
}

@a_jukov
Этот enum отвечает за определение местоположения заголовка для точки внутри определенной области. В нем же и расчитываются координаты. Причем так, что если точка находится близко к краю области, заголовок смещается, чтобы он полностью отобразился (прикрепил скриншот чтобы было нагляднее).
Чтобы избавиться от условных операторов в коде, решил переместить логику расчета двух главных переменных — left и bottom заголовка в отдельные private enum'ы. По-моему получилось неплохо.
enum class LabelPosition(private val vertical: Vertical, private val horizontal: Horizontal) {
TOP_LEFT(Vertical.TOP, Horizontal.LEFT),
TOP_RIGHT(Vertical.TOP, Horizontal.RIGHT),
TOP_CENTER(Vertical.TOP, Horizontal.CENTER),
BOTTOM_LEFT(Vertical.BOTTOM, Horizontal.LEFT),
BOTTOM_RIGHT(Vertical.BOTTOM, Horizontal.RIGHT),
BOTTOM_CENTER(Vertical.BOTTOM, Horizontal.CENTER);
fun createLabelPositionRect(
area: RectF,
width: Float,
height: Float,
x: Float,
y: Float,
margin: Float,
padding: Float
): RectF {
val bottom = vertical.getBottom(area, height, y, margin)
val top = bottom - height
val left = horizontal.getLeft(area, width, x, margin, padding)
val right = getLabelRight(left, width, padding)
return RectF(left, top, right, bottom)
}
private fun getLabelRight(left: Float, width: Float, padding: Float): Float =
left + width + padding
private enum class Vertical {
TOP {
override fun getBottom(
area: RectF,
height: Float,
y: Float,
margin: Float
): Float = max(y - margin, area.top + height)
},
BOTTOM {
override fun getBottom(
area: RectF,
height: Float,
y: Float,
margin: Float
): Float = min(y + margin + height, area.bottom - margin / 2)
};
abstract fun getBottom(
area: RectF,
height: Float,
y: Float,
margin: Float
): Float
}
private enum class Horizontal {
LEFT {
override fun getLeft(
area: RectF,
width: Float,
x: Float,
margin: Float,
padding: Float
): Float = max(x - margin - padding - width, area.left + margin / 2)
},
RIGHT {
override fun getLeft(
area: RectF,
width: Float,
x: Float,
margin: Float,
padding: Float
): Float = min(x + margin, area.right - GraphBase.yAxisLabelWidth - padding / 2 - width)
},
CENTER {
override fun getLeft(
area: RectF,
width: Float,
x: Float,
margin: Float,
padding: Float
): Float = max(
0f + margin / 2,
min(
x - width / 2 - padding / 2,
area.right - GraphBase.yAxisLabelWidth - margin - width
)
)
};
abstract fun getLeft(
area: RectF,
width: Float,
x: Float,
margin: Float,
padding: Float
): Float
}
}
