package com.example.programpengurutanangka import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.compose.foundation.layout.* import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.example.programpengurutanangka.ui.theme.ProgramPengurutanAngkaTheme class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() setContent { ProgramPengurutanAngkaTheme { Scaffold { innerPadding -> ProgramPengurutanAngka( modifier = Modifier .padding(innerPadding) .padding(16.dp) ) } } } } } @Composable fun ProgramPengurutanAngka(modifier: Modifier = Modifier) { var input by remember { mutableStateOf("") } var result by remember { mutableStateOf("") } var error by remember { mutableStateOf(null) } var ascending by remember { mutableStateOf(true) } Column( modifier = modifier.fillMaxSize(), verticalArrangement = Arrangement.Top, horizontalAlignment = Alignment.Start ) { OutlinedTextField( value = input, onValueChange = { input = it error = null }, label = { Text("Masukkan angka (contoh: 9, 5, 1 atau 9 5 1 atau 9;5;1)") }, modifier = Modifier.fillMaxWidth(), keyboardOptions = KeyboardOptions.Default.copy(keyboardType = KeyboardType.Text) ) Spacer(modifier = Modifier.height(8.dp)) Row(verticalAlignment = Alignment.CenterVertically) { Text("Urutkan:") Spacer(modifier = Modifier.width(8.dp)) RadioButton(selected = ascending, onClick = { ascending = true }) Text("Ascending", modifier = Modifier.padding(end = 12.dp)) RadioButton(selected = !ascending, onClick = { ascending = false }) Text("Descending") } Spacer(modifier = Modifier.height(12.dp)) Button(onClick = { // Ambil semua angka yang valid (mendukung sign dan desimal, koma/dot sebagai pemisah desimal) val regex = Regex("-?\\d+[\\.,]?\\d*") val parsed = regex.findAll(input) .map { it.value.replace(',', '.') } // ubah koma jadi dot supaya parseDouble berhasil .mapNotNull { it.toDoubleOrNull() } .toList() if (parsed.isEmpty()) { error = "Tidak ditemukan angka valid. Gunakan pemisah koma/spasi/semicolon atau masukkan angka." result = "" } else { val sorted = if (ascending) parsed.sorted() else parsed.sortedDescending() result = sorted.joinToString(", ") { n -> // tampilkan tanpa .0 jika integer if (n % 1.0 == 0.0) n.toLong().toString() else n.toString() } error = null } }) { Text("Urutkan") } Spacer(modifier = Modifier.height(12.dp)) if (error != null) { Text(text = error!!, color = MaterialTheme.colorScheme.error) } Text( text = "Hasil: $result", style = MaterialTheme.typography.bodyLarge, modifier = Modifier.padding(top = 8.dp) ) } } @Preview(showBackground = true) @Composable fun PreviewProgram() { ProgramPengurutanAngkaTheme { ProgramPengurutanAngka() } }